关于C#:CMake提升进口目标

CMake boost imported targets

您能解释一下我该如何在CMake文件中使用Boost::headers之类的东西吗?我试图以某种方式利用它,但是它似乎以与我理解的方式不同的方式工作。

1
2
3
4
5
6
7
8
9
10
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] - Target for specific component dependency (shared or static library)

[C] is lower-case

我可以同意,按照CMake的定义,ASIO可能不是库。文档强调它必须是静态库或共享库。 ASIO仅是标头,因此它只是要包含的文件。

因此,让我们尝试以另一种方式使用它:

1
2
3
4
5
6
7
8
9
10
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)。在find_package中使用不带S${Boost_INCLUDE_DIR}来查找头文件。

Boost :: asio是仅标头的库,并且CMakes FindBoost.cmake模块不会为仅标头的库创建目标。
处理Boost::asio时,需要将systemthread添加到find_package中所需的模块,并将Boost::threadBoost::system添加到target_link_libraries调用中。请参阅https://think-async.com/Asio/AsioAndBoostAsio.html了解详细说明。

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

1
2
3
4
5
6
7
8
9
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现在是它的别名。