【问题标题】:CMake's find_package with header only librariesCMake 的 find_package 仅包含标头库
【发布时间】:2019-10-01 13:57:02
【问题描述】:

我最近学习了如何在 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 的实现要求我们在类 UNIX 系统上链接pthread,因此我们可以说这个库有一个依赖项,即线程库。是否有任何方便的解决方案可以像 CMake 中的 Boost.Filesystem 一样使用它?

【问题讨论】:

  • "是否有任何方便的解决方案可以像 CMake 中的 Boost.Filesystem 一样使用它?" - 您可以创建一个 INTERFACE 库。它与 IMPORTED 目标(如 Boost.Filesystem)的主要区别在于缺少 IMPORTED_LOCATION 属性。正是这与普通的头文件库不同。

标签: boost cmake build-system


【解决方案1】:

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

【讨论】:

  • 那么Boost::boost的目的是什么?我该如何使用它?我喜欢导入的目标,因为我不必关心库依赖项。您能否提供一些 Boost::boost 的示例用例?拥有像 Boost::asio 这样的东西并且根本不关心 Boost::system 会很棒。
  • 此外,您提供的第一个示例对我不起作用。 No header defined for boost; skipping header check
  • 很抱歉第一个示例不适合您。根据我给Boost::boost 的链接是Boost:headers 的别名,所以你可以尝试find_package(Boost COMPONENTS headers REQUIRED)。通过定义宏 BOOST_ERROR_CODE_HEADER_ONLY 或使用来自 think-async.com/Asioasio 库,可以在不使用 boost::system 的情况下使用 boost::asio
  • 它不适用于 boost 和 headers。这就是为什么我不明白它的目的。
  • @KasataAta 我同意你的看法。尽管遵循 cmake 文档,但我给出的原始答案不再适用于我!我已将其修改为现在可以使用的内容。
猜你喜欢
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 2020-03-04
  • 2021-02-20
相关资源
最近更新 更多