CMake提高了进口目标

时间:2019-10-02 13:53:42

标签: c++ boost cmake

您能解释一下我该如何在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的文档并不是我见过的最好的文档。很难获得与更复杂事物有关的任何信息。

1 个答案:

答案 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::asiosystem添加到find_package所需的模块中,并将threadBoost::thread添加到target_link_libraries调用中。参见https://think-async.com/Asio/AsioAndBoostAsio.html以获得很好的解释。

因此,您的CMakeLists.txt如下所示:

Boost::system

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