Boost CMake';s find_包,仅包含头库

Boost CMake';s find_包,仅包含头库,boost,cmake,build-system,Boost,Cmake,Build System,最近我学习了如何在CMake中使用find_包,我注意到它只适用于预编译的库 这条线路按预期运行: find_package(Boost COMPONENTS filesystem REQUIRED) 如果成功,我可以稍后使用类似的方法: target_link_libraries(target Boost::filesystem) 使用接口可以很容易地链接Boost.Filesystem所需的所有必要依赖项。但是,对于Boost.Asio这样的只头库,如果有类似的解决方案,那就太好了(我知

最近我学习了如何在CMake中使用find_包,我注意到它只适用于预编译的库

这条线路按预期运行:

find_package(Boost COMPONENTS filesystem REQUIRED)
如果成功,我可以稍后使用类似的方法:

target_link_libraries(target Boost::filesystem)
使用接口可以很容易地链接Boost.Filesystem所需的所有必要依赖项。但是,对于Boost.Asio这样的只头库,如果有类似的解决方案,那就太好了(我知道可以将它构建到单独的对象中,但出于示例目的,我将把它视为只头库)

这不会像预期的那样起作用


ASIO的实现要求我们在类UNIX系统上链接
pthread
,因此我们可以说这个库有一个依赖项,即线程库。是否有任何方便的解决方案可以与CMake中的Boost.Filesystem相同的方式使用它?

您可以使用
find\u package
通过不指定目标来查找仅标头的依赖项,请参阅,即:

但是,您会发现,
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)

“是否有任何方便的解决方案可以像CMake中的Boost.Filesystem那样使用它?”-您可以创建一个接口库。它与导入的目标(如Boost.Filesystem)的主要区别在于缺少
IMPORTED\u LOCATION
属性。这与普通的只头库完全不同。那么Boost::Boost的目的是什么呢?我如何使用它?我喜欢导入的目标,因为我不必关心库依赖关系。您能提供Boost::Boost的一些示例用例吗?如果有像Boost::asio这样的东西,并且根本不关心Boost::system,那就太好了。而且,您提供的第一个示例对我来说并不适用<代码>没有为boost定义标题;跳过页眉检查很抱歉,第一个示例不适用于您。根据我给出的链接,
Boost::Boost
Boost:headers
的别名,因此您可以尝试
find_-package(需要Boost-COMPONENTS-headers)
。通过仅定义宏
boost\u ERROR\u code\u HEADER\u
或使用其中的
asio
库,可以在不使用
boost::system
的情况下使用
boost::asio
。这就是为什么我不明白它的目的。@kasatata我同意你的看法。尽管遵循了cmake文档,但我给出的原始答案不再适用于我!。我已经把它修改成现在能用的。
find_package(Boost REQUIRED)
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIRS})
else()
  message(STATUS "Boost NOT Found !")
endif(Boost_FOUND)
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)