在 c++ 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)

然而,我感到有点不舒服,因为set(Boost_ROOT "${CMAKE_BINARY_DIR}/_deps/boost-src")看起来很粗糙——它有一个强烈的假设,即提取的内容将存储在_deps文件夹中,我更想把它放在像3rd_partyexternal这样的专用文件夹中,作为典型的C++项目布局约定。

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

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

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

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

在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。

相关内容

最新更新