CMake 提升进口目标

CMake boost imported targets

本文关键字:目标 CMake      更新时间:2023-10-16

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

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)

此示例不起作用。它是由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)

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

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

包含 Boost 标头的目标命名为Boost::boost而不是Boost::headers

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

Boost::asio 是一个仅标头库,CMakes FindBoost.cmake 模块不会为仅标头库创建目标。 处理Boost::asio时,您需要在find_package中向所需的模块添加systemthread,并在target_link_libraries调用中添加Boost::threadBoost::system。有关很好的解释,请参阅 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)

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