您能解释一下我该如何在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]是小写
我可以同意,按照CMake的定义,ASIO可能不是库。文档强调它必须是静态库或共享库。 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的文档并不是我见过的最好的文档。很难获得与更复杂事物有关的任何信息。
答案 0 :(得分:3)
包含Boost标头的目标命名为Boost::boost
而不是Boost::headers
。
如果使用它,则不需要target_include_directories(... ${Boost_INCLUDE_DIRS})
(变量末尾的注释S
)。在find_package中使用没有${Boost_INCLUDE_DIR}
的{{1}}来查找头文件。
Boost :: asio是仅标头的库,而CMakes FindBoost.cmake模块不会为仅标头的库创建目标。
处理S
时,您需要将Boost::asio
和system
添加到find_package所需的模块中,并将thread
和Boost::thread
添加到target_link_libraries调用中。参见https://think-async.com/Asio/AsioAndBoostAsio.html以获得很好的解释。
因此,您的CMakeLists.txt如下所示:
Boost::system
编辑:CMake 3.15中引入了Boost :: headers,而Boost :: boost现在是其别名。