首页 > 解决方案 > 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 相同的方式使用它?

标签: boostcmakebuild-system

解决方案


您可以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)

推荐阅读