CMake boost imported targets
您能解释一下我该如何在CMake文件中使用
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) |
此示例不起作用。这是由
文档说:
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 :: asio是仅标头的库,并且CMakes FindBoost.cmake模块不会为仅标头的库创建目标。
处理
因此,您的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现在是它的别名。