Z
ZHANK
工程与工具

CMake 进阶

target 现代用法、FetchContent 下载依赖、CPack 打包、presets

CMake 进阶

现代 CMake 以 target 为中心——target_link_libraries 传播属性和依赖,告别全局 include_directories

学完本章你将: 掌握现代 target 用法、FetchContent 下载依赖、CPack 打包。


现代 CMake:以 target 为中心

cmake
cmake_minimum_required(VERSION 3.20)
project(MyApp)

add_library(mylib STATIC
    src/mylib.cpp
)
target_include_directories(mylib PUBLIC include)  # 使用者自动获得 include 路径
target_compile_features(mylib PUBLIC cxx_std_17)

add_executable(app main.cpp)
target_link_libraries(app PRIVATE mylib)  # PRIVATE = 不传播给 app 的使用者

FetchContent —— 下载依赖

cmake
include(FetchContent)

FetchContent_Declare(
    fmt
    GIT_REPOSITORY https://github.com/fmtlib/fmt.git
    GIT_TAG 10.2.1
)
FetchContent_MakeAvailable(fmt)

target_link_libraries(app PRIVATE fmt::fmt)
# 不需要 vcpkg 或 conan——源码直接集成

CPack —— 打包

cmake
include(CPack)
set(CPACK_PACKAGE_NAME "MyApp")
set(CPACK_PACKAGE_VERSION "1.0.0")

# cpack -G ZIP  →  生成 MyApp-1.0.0.zip
# cpack -G DEB  →  生成 .deb 安装包(Linux)

CMake Presets

json
// CMakePresets.json
{
    "configurePresets": [
        { "name": "debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug" } },
        { "name": "release", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release" } }
    ]
}
// cmake --preset debug