我想在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_party
或external
这样的专用文件夹中,作为典型的C++项目布局约定。
我发现有两种方法可以做到这一点:
- 使用
FetchContent_Declare
下载项目。然而,我不知道如何执行额外的构建命令来编译非纯头库 - 使用
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_package
的REQUIRED
参数之后命名<component>
。
不要干扰FetchContent。您的用户将知道如何获得必要的依赖关系。您可以提供vcpkg.json
文件或conanfile.txt
文件,以便分别更容易地使用Vcpkg和/或Conan。