CMake学习
CMake是一个跨平台的自动化构建系统的程序,通过配置 CMakeLists.txt 文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本。自动生成不同平台的构建文件(makefile、Ninja等文件)
一、基本工作流程
1、编写CMakeLists.txt文件:定义项目的构建规则和依赖关系
2、生成构建文件:使用CMake生成适合当前平台的构建系统文件(如makefile)
3、执行构建:使用生成的构建系统文件(make、Ninja)来编译项目

二、基本语法
CMakeLists.txt由一系列CMake指令组合成,指令格式:命令名(参数列表)
1、指定CMake最低版本
# 语法:cmake_minimum_required(VERSION <version>)
# 该指令必须放在 CMakeLists.txt 的最顶部
# 示例:要求 CMake 版本不低于 3.10
cmake_minimum_required(VERSION 3.10)
2、定义项目名称和语言
# 语法:project(<项目名> [<语言>...])
# 语言参数可选,常用值:CXX(C++)、C(C 语言)
# 调用 project() 后会自动设置 PROJECT_NAME 等变量
project(TestProject CXX)
3、添加可执行文件
# 语法:add_executable(<目标名> <源文件>...)
# 将指定的源文件编译生成一个可执行文件
add_executable(MyApp main.cpp utils.cpp)
4、添加库文件
# 语法:add_library(<目标名> [STATIC | SHARED | MODULE] <源文件>...)
# STATIC:静态库(.a / .lib),编译时直接嵌入可执行文件
# SHARED:动态库(.so / .dll),运行时加载
# 不指定类型时,由 BUILD_SHARED_LIBS 变量决定
add_library(MyLib STATIC library.cpp)
5、链接库到目标
# 语法:target_link_libraries(<目标> <库>...)
# 将指定的库链接到目标(可执行文件或其他库)
# 可以链接自己项目中的库目标,也可以链接外部库
target_link_libraries(MyApp PRIVATE MyLib)
6、设置变量
# 语法:set(<变量名> <值>...)
# 定义一个普通变量,后续通过 ${变量名} 引用
set(CMAKE_CXX_STANDARD 17)
# 同时设置多个值(列表)
set(SOURCES main.cpp utils.cpp helper.cpp)
add_executable(MyApp ${SOURCES})
7、为目标指定头文件路径
# 语法:target_include_directories(<目标>
# [BEFORE | AFTER]
# [SYSTEM]
# [PUBLIC | PRIVATE | INTERFACE]
# <路径>...)
# PUBLIC:当前目标和依赖它的目标都能使用该路径
# PRIVATE:只有当前目标能使用
# INTERFACE:只有依赖当前目标的其他目标能使用
target_include_directories(MyApp PRIVATE ${PROJECT_SOURCE_DIR}/include)
8、设置安装规则
# 语法:install(TARGETS <目标>...
# [RUNTIME DESTINATION <可执行文件安装路径>]
# [LIBRARY DESTINATION <动态库安装路径>]
# [ARCHIVE DESTINATION <静态库安装路径>]
# [INCLUDES DESTINATION <头文件安装路径>])
# 定义执行 make install 时各类型文件的安装位置
install(TARGETS MyApp RUNTIME DESTINATION bin)
9、条件语句
# 语法:if(<条件>) ... elseif(<条件>) ... else() ... endif()
# CMake 支持的条件表达式包括:比较、逻辑运算、变量判断等
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
# Debug 模式下启用调试信息
message(STATUS "当前为 Debug 构建模式")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
else()
# Release 模式下启用优化
message(STATUS "当前为 Release 构建模式")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
endif()
10、自定义指令
# 语法:add_custom_command(
# TARGET <目标>
# PRE_BUILD | PRE_LINK | POST_BUILD
# COMMAND <命令> [参数...]
# [COMMENT <说明>]
# [VERBATIM])
# PRE_BUILD:在编译前执行
# PRE_LINK:在链接前执行
# POST_BUILD:在构建完成后执行
add_custom_command(
TARGET MyApp POST_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "构建完成!"
COMMENT "打印构建完成信息"
)
三、实例
# 文件路径:项目根目录/CMakeLists.txt
# 1.指定 CMake 最低版本(必须放最前面)
cmake_minimum_required(VERSION 3.10)
# 2.定义项目名称 、版本和语言
project(MyProject VERSION 1.0.0 LANGUAES CXX)
# 3. 设置C++ 标准为 C++ 17, 并强制要求使用该标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 4. 设置静态库目标
add_library(MyLib STATIC
src/lib/core.cpp # 核心功能实现
src/lib/helper.cpp # 辅助函数实现
)
# 5. 添加可执行文件目标
add_executable(MyApp
src/main.cpp # 程序入口
src/utils.cpp # 工具函数
)
# 6. 为库目标指定公开头文件路径
# PUBLIC 表示使用 MyLib 的目标也能访问该路径
target_include_directories(MyLib PUBLIC ${PROJECT_SOURCE_DIR}/include)
# 7. 为可执行文件指定私有头文件路径
target_include_directories(MyApp PRIVATE ${PROJECT_SOURCE_DIR}/src)
# 8. 将 MyLib 链接到 MyApp
target_link_libraries(MyApp PRIVATE MyLib)
# 9. 设置安装规则
install(TARGETS MyApp RUNTIME DESTINATION bin)
install(TARGETS MyLib ARCHIVE DESTINATION lib)
四、 运行构建实例
#1.在项目路径下创建bulid文件夹,并切换到该路径
mkdir bulid & cd bulid
#2. 生成构建文件
cmake ..
#3. 编译项目
cmake --bulid .
#4. 安装到系统目标
cmake --install .

浙公网安备 33010602011771号