CMake 使用 FetchContent 配置 Boost

最近在尝试使用 C++ 连接 ZMQ。很久没有写 C++ 了,很多东西都已经忘记了。

不像 Rust 可以直接通过 cargo 从网上直接下载库,C++ 目前热gv没有“大一统”的包管理器,库依赖还是需要自己来配。如果使用 Cmake,所有库都要在开发机上安装一遍,体验不怎么好。cmake 在 3.11 后可以用 FetchContent 自动下载源码处理依赖,体验了一下还不错,记录一下。

先上最终的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.22)
project(connectivity_check)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_EXE_LINKER_FLAGS "-static")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")

include(FetchContent)

set(BOOST_INCLUDE_LIBRARIES system program_options)
set(BOOST_ENABLE_CMAKE ON)
FetchContent_Declare(
        Boost
        URL https://github.com/boostorg/boost/releases/download/boost-1.83.0/boost-1.83.0.tar.xz
)
FetchContent_MakeAvailable(Boost)

FetchContent_Declare(json URL https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz)
FetchContent_MakeAvailable(json)

FetchContent_Declare(zeromq URL https://github.com/zeromq/libzmq/releases/download/v4.3.5/zeromq-4.3.5.tar.gz)
FetchContent_Declare(cppzmq URL https://github.com/zeromq/cppzmq/archive/refs/tags/v4.10.0.tar.gz)
FetchContent_MakeAvailable(zeromq cppzmq)

add_executable(connectivity_check main.cpp zmq.hpp utils.cpp args.cpp)
target_link_libraries(connectivity_check PRIVATE cppzmq-static nlohmann_json::nlohmann_json Boost::program_options)

加载速度可以接受,比直接在主机上使用 b2 全量构建一次要快不少(速度快可能是我这里直选择了 program_options 的原因)。

有几点需要注意:

  1. 使用 FetchContent 虽然省略了在主机上安装库的过程,但是也导致了库文件的重复下载。这个问题类似于 node_modules
  2. 优先使用 URL 方式加载 Git 代码。Git 的提交历史对于编码和构建来说意义不大,如果直接使用 Git,会使用数倍的磁盘空间:

    此处 debug 使用的是 URL 方式,release 使用 Git 方式,即使加上了 GIT_SHALLOW,仍然需要 2.1G。

题外话:
如果要使用静态链接,cppzmq 要替换为 cppzmq-static

CC BY-NC-SA 4.0 本作品使用基于以下许可授权:Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注