在 c++ cmake 项目中导入外部 boost 的最佳实践是什么?

Qia*_*iao 6 c++ boost cmake

我想在 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)
Run Code Online (Sandbox Code Playgroud)

然而,我感觉有点不舒服,因为set(Boost_ROOT "${CMAKE_BINARY_DIR}/_deps/boost-src")看起来很老套——它有一个强烈的假设,即获取的内容将存储在_deps文件夹中,我宁愿将其放在专用文件夹中,例如3rd_partyexternal作为典型的 C++ 项目布局约定。

我发现有两种方法可以做到这一点:

  1. 用于FetchContent_Declare下载项目。但是,我不知道如何执行额外的构建命令来编译非仅标头库。
  2. 用于ExternalProject_Add下载并编译boost项目。它看起来像一种老式的方式,此外,我不知道如何以这种方式将 boost 作为依赖项的一部分添加到顶级 CMakeLists.txt 中。

我采用的方法是前一种方法,但我想知道将外部 boost (不是系统默认安装的)作为 C++ 项目的一部分包含在内是否是正确的方法,或者是否有这样做的最佳实践?

欢迎任何意见、建议、解答。谢谢。

Ale*_*ing 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)
Run Code Online (Sandbox Code Playgroud)

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

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