CMake 提升进口目标
CMake boost imported targets
你能解释一下我应该如何在我的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中向所需的模块添加system
和thread
,并在target_link_libraries调用中添加Boost::thread
和Boost::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现在是它的别名。
- 在 CMake 中为每个目标设置编译器/链接器标志
- 如何在 CMake 中对目标依赖项进行分组?
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- CMake 错误 - 目标 foo INTERFACE_SOURCES属性包含在源目录中以前缀为前缀的路径
- 如何从目标触发 CMake 重新配置?
- 为什么子项目 CMAKE 不考虑 fno-sanitize,请禁用目标的消毒器
- CMake "安装" 目标及其 SO 依赖项
- CMake on FindOpenGL.cmake 中的错误,当使用导入的目标 OpenGL::GLU?
- 在对象库中包含 CMake 目标的标头
- CMake 设置使用不正确的参数数调用的目标属性
- CMake 的导出如何知道目标版本是什么?
- CMake:防止在子目录库项目中生成测试可执行目标
- 如何让KDevelop & CMake只构建特定目标?
- CMake:什么是可能的目标源类型?它们可以扩展吗
- CMake无法确定目标的链接器语言:fileloader
- CMake 库目标并不总是出现在 Visual Studio 2017 的"启动项"下拉列表中。
- 如何使用cmake从主要的CMakeList.txt复制目标文件?
- 导出(安装)的 cmake 目标是否可分发?
- CMake 提升进口目标
- CMAKE+QT MAC 如何设置部署目标?