我希望在一个 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_party
或 external
这样专用的文件夹中,以符合典型的 C++ 项目布局约定。我发现有两种方法可以做到这一点:
- 使用
FetchContent_Declare
下载项目。然而,我不知道如何执行额外的构建命令来编译非头文件库。 - 使用
ExternalProject_Add
下载和编译 boost 项目。它看起来像是一个老派的方式,此外,我不知道如何以这种方式将 boost 添加为顶层 CMakeLists.txt 的依赖项。
欢迎任何意见、建议和答案。谢谢。
FetchContent
和find_package
没有任何意义。只需使用find_package
和一个完全外部的包管理器,如 vcpkg 或主机系统的即可。 - Alex Reinking