boost - CMake 的 find_package 仅包含标头库
问题描述
我最近学会了如何在 CMake 中使用 find_package,我注意到它只适用于预编译的库。
此行按预期工作:
find_package(Boost COMPONENTS filesystem REQUIRED)
如果成功,我以后可以使用类似的东西:
target_link_libraries(target Boost::filesystem)
使用接口可以很容易地链接 Boost.Filesystem 所需的所有必要依赖项。但是对于像 Boost.Asio 这样的纯头文件库有类似的解决方案会很棒(我知道可以将它构建到单独的对象中,但出于示例目的,我会将其视为纯头文件库)
find_package(Boost COMPONENTS asio REQUIRED)
target_link_libraries(target Boost::asio)
这不会按预期工作。
ASIO 的实现要求我们pthread
在类 UNIX 系统上进行链接,因此我们可以说这个库有一个依赖项,即线程库。是否有任何方便的解决方案以与 CMake 中的 Boost.Filesystem 相同的方式使用它?
解决方案
您可以find_package
通过不指定目标来查找仅标头依赖项,请参阅FindBoost,即:
find_package(Boost REQUIRED)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
else()
message(STATUS "Boost NOT Found !")
endif(Boost_FOUND)
但是,您会发现它Boost::asio
只是标题,但它需要Boost::system
. 因此,您需要:
find_package(Boost COMPONENTS system REQUIRED)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(target Boost::system)
else()
message(STATUS "Boost NOT Found !")
endif(Boost_FOUND)
推荐阅读
- c++ - 我的一段代码需要一些支持(c++)
- android - 如何从 GraphQL API 调用中获取 JSON 对象元素?
- java - 按下 HOME 按钮时,防止 android 活动进入暂停状态
- python - 使用转换器 run_ner.py 进行微调时出错
- java - 除非我添加新用户,否则我的用户列表或其他任何内容都不会出现
- excel - VBA 导出为 CSV UTF-8
- react-native - 如何在 usestate 中使用从 REST api 获得的经度/纬度
- c++ - gcc 中的 -O2 和 -fPIC 选项
- java - 使用 Hibernate 和 JSON 更新 ManyToMany
- python - 如何删除接触图像边界的对象(单元格)?