gpt4 book ai didi

c++ - CMake boost 导入的目标

转载 作者:行者123 更新时间:2023-11-30 02:14:19 24 4
gpt4 key购买 nike

你能解释一下我应该如何在我的 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 似乎以其他方式处理,因为它是仅 header 库。

文档说:

Boost::[C] - Target for specific component dependency (shared or static library)

[C] is lower-case

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

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

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 header 的目标名为 Boost::boost 而不是 Boost::headers

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

Boost::asio 是一个只有头文件的库,CMakes FindBoost.cmake 模块不会为只有头文件的库创建目标。在处理 Boost::asio 时,您需要将 systemthread 添加到 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)

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

关于c++ - CMake boost 导入的目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58203003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com