在一个C++的CMake项目中,导入外部boost库的最佳实践是什么?

6

我希望在一个 C++ 的 cmake 项目中引入外部的 boost 库。

我做了几次尝试,最终得到了下面这个 CMakeLists.txt 文件可以工作:

cmake_minimum_required(VERSION 3.14)
project(my_project
    VERSION 0.0.1
    LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 11)

include(FetchContent)
FetchContent_Declare(
    boost
    URL https://boostorg.jfrog.io/artifactory/main/release/1.78.0/source/boost_1_78_0.tar.bz2
)
FetchContent_MakeAvailable(boost)

set(Boost_ROOT "${CMAKE_BINARY_DIR}/_deps/boost-src")
set(BOOST_INCLUDEDIR ${Boost_ROOT})

find_package(Boost 1.78)
include_directories(${Boost_INCLUDE_DIRS})

add_executable(
    boost_test
    tests/boost_test.cpp)

然而,我感到有点不舒服,因为 set(Boost_ROOT "${CMAKE_BINARY_DIR}/_deps/boost-src") 看起来很hacky -- 它强烈假设获取的内容将存储在 _deps 文件夹中,但我更想将其放在像 3rd_partyexternal 这样专用的文件夹中,以符合典型的 C++ 项目布局约定。
我发现有两种方法可以做到这一点:
  1. 使用 FetchContent_Declare 下载项目。然而,我不知道如何执行额外的构建命令来编译非头文件库。
  2. 使用 ExternalProject_Add 下载和编译 boost 项目。它看起来像是一个老派的方式,此外,我不知道如何以这种方式将 boost 添加为顶层 CMakeLists.txt 的依赖项。
我采用的方式是前者,但我想知道将外部 boost(而不是系统默认安装的 boost)包含为 C++ 项目的一部分的正确方法是什么,或者是否有最佳实践可供参考?
欢迎任何意见、建议和答案。谢谢。

2
建议使用像Conan或vcpkg这样的包管理器来管理依赖项。 - Alan Birtles
2
同时使用 FetchContentfind_package 没有任何意义。只需使用 find_package 和一个完全外部的包管理器,如 vcpkg 或主机系统的即可。 - Alex Reinking
1个回答

0

在CMake项目中使用Boost的最佳方式如下:

cmake_minimum_required(VERSION 3.25)
project(boost-example)

find_package(Boost REQUIRED)

add_executable(myapp main.cpp)
target_link_libraries(myapp PRIVATE Boost::headers)
target_compile_features(myapp PRIVATE cxx_std_11)

Boost::headers 是链接所有 Boost 仅头文件组件的库。如果您需要一个包含真实库的组件,则也要链接到 Boost::<component>,并确保在 find_packageREQUIRED 参数之后命名 <component>

不要搞乱 FetchContent。您的用户将知道如何获取必要的依赖项。您可以提供一个 vcpkg.json 文件或一个 conanfile.txt,以使使用 Vcpkg 和/或 Conan 更容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接