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