c++ - 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)
这个例子不起作用。它是由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
not Boost::headers
。
如果你使用它,你不需要target_include_directories(... ${Boost_INCLUDE_DIRS})
(注意S
变量末尾的)。${Boost_INCLUDE_DIR}
在 find_package 中使用withoutS
来查找头文件。
Boost::asio 是一个只有头文件的库,CMakes FindBoost.cmake 模块不会为只有头文件的库创建目标。处理时,Boost::asio
您需要在 find_package 中添加system
和添加thread
到您所需的模块,并将和添加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 现在是它的别名。
推荐阅读
- python - 为 QTableWidget 的列分配不同的宽度
- android - 如何完美地强制更新和应用程序?
- python - 即使 WebElement 不可见,is_displayed() 方法也会返回 true
- java - 在 Spring Kafka 中找不到处理恢复的正确方法
- c# - 如果选择的项目值 == 某些东西,Linq 选择在哪里
- laravel - 用于更改数据库中值的 HTML 链接:使用 Laravel 的布尔值、字符串或整数
- ruby-on-rails - RSpec 类型请求和 jb gem
- python - 如何将字符串中的“字母表情符号”转换为常规字母(英文)?在蟒蛇
- sql - 如何按除法获取数据的累积计数
- python - 有没有办法将字符串“1+2-3”转换为结果0