CMake 提升导入目标

Kas*_*Ata 2 c++ boost cmake

你能解释一下我应该如何使用Boost::headers我的 CMake 文件中的东西吗?我尝试以某种方式利用它,但它的工作方式似乎与我理解的不同。

cmake_minimum_required(VERSION 3.15)

project(Test)

find_package(Boost COMPONENTS asio REQUIRED)

add_executable(test main.cpp)

target_include_directories(test SYSTEM PUBLIC ${Boost_INCLUDE_DIR})
target_link_libraries(test PUBLIC Boost::headers)
Run Code Online (Sandbox Code Playgroud)

这个例子不起作用。它是由COMPONENTS asio。ASIO 似乎以其他方式对待,因为它只是头文件库。

文档说:

Boost::[C] - 特定组件依赖项的目标(共享或静态库)

[C] 为小写

我同意 ASIO 可能不是 CMake 定义中的库。文档强调它必须是静态库或共享库。ASIO 只是标头,因此它只是一个要包含的文件。

那么让我们尝试以另一种方式使用它:

cmake_minimum_required(VERSION 3.15)

project(Test)

find_package(Boost REQUIRED)

add_executable(test main.cpp)

target_include_directories(test SYSTEM PUBLIC ${Boost_INCLUDE_DIR})
target_link_libraries(test PUBLIC Boost::headers)
Run Code Online (Sandbox Code Playgroud)

现在我假设如果 CMake 设法找到 Boost,ASIO 就会出现。可以执行配置步骤,但是当我尝试构建整个项目时,发现我缺少一些依赖项。Boost::headers 似乎是不必要的。

不幸的是,CMake 的文档并不是我见过的最好的。很难获得与更复杂的事情相关的任何信息。

vre*_*vre 7

包含 Boost 标头的目标被命名为Boost::boostnot Boost::headers。

如果您使用它,则不需要target_include_directories(... ${Boost_INCLUDE_DIRS})(请注意S变量末尾的 )。${Boost_INCLUDE_DIR}withoutS用于 find_package 中查找头文件。

Boost::asio 是仅标头库,CMake FindBoost.cmake 模块不会为仅标头库创建目标。处理时,Boost::asio您需要将system和添加thread到 find_package 中所需的模块,并将Boost::thread和添加Boost::system到您的 target_link_libraries 调用中。请参阅https://think-async.com/Asio/AsioAndBoostAsio.html以获得很好的解释。

所以你的 CMakeLists.txt 将如下所示:

cmake_minimum_required(VERSION 3.15)

project(Test)

find_package(Boost COMPONENTS system thread REQUIRED)

add_executable(test main.cpp)

target_link_libraries(test PUBLIC Boost::boost Boost::system Boost::thread)
Run Code Online (Sandbox Code Playgroud)

编辑:Boost::headers 是在 CMake 3.15 中引入的,Boost::boost 现在是它的别名。

  • 目标结合了链接器、编译器和其他工具的属性。因此,它可能设置了一个包含包含路径的属性,另一个包含构建类型 Release 的库名称的属性,另一个包含构建类型 Debug 的库名称。此外,还可以为编译器定义和开关、链接器开关等设置属性……因此,目标将所有这些内容组合在一个名称中。CMake 会将设置正确传播到所使用的工具。您所要做的就是将目标添加到 target_link_libraries 调用中。 (3认同)
  • 但为什么要链接到头文件呢?我找不到任何关于这个目标一般做什么的信息。似乎什么也没做。 (2认同)