CMake 常用指令、命令和函数的大全表格,包含基础语法、示例及使用场景:
例子:
cmake_minimum_required(VERSION 3.10)
project(Homework)
# 设置 C 标准
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED True)
# 定义源文件目录
set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/homework/0625/双向链表")
# 定义源文件列表
set(SOURCES
"${SOURCE_DIR}/main.c"
"${SOURCE_DIR}/list.c"
)
# 添加可执行文件
add_executable(main ${SOURCES})
# 添加包含目录
target_include_directories(main PRIVATE
"${SOURCE_DIR}"
)
# 如果需要链接其他库,可以在这里添加
# 例如:
# target_link_libraries(main PRIVATE pthread)
基础项目配置
命令/函数 | 说明 | 参数示例 | 使用场景/示例 |
---|
cmake_minimum_required(VERSION <min> [<max>]) | 指定 CMake 最低版本 | VERSION 3.10 | 每个 CMakeLists.txt 开头必须:
cmake_minimum_required(VERSION 3.10) |
project(<PROJECT_NAME> [LANGUAGES] [VERSION]) | 定义项目名称、语言和版本 | project(MyApp VERSION 1.0 LANGUAGES CXX) | 初始化项目,设置 C++ 语言:
project(MyApp LANGUAGES CXX) |
add_executable(<target> [sources...]) | 生成可执行文件 | add_executable(app main.cpp utils.cpp) | 编译 main.cpp 和 utils.cpp 生成 app |
add_library(<target> [STATIC/SHARED] [sources...]) | 生成库文件(静态库或动态库) | add_library(mylib STATIC lib.cpp) | 生成名为 mylib 的静态库 |
target_link_libraries(<target> [PRIVATE/PUBLIC/INTERFACE] <libs...>) | 链接库到目标 | target_link_libraries(app PRIVATE mylib Threads::Threads) | 将 mylib 和线程库链接到 app |
变量与作用域
命令/函数 | 说明 | 参数示例 | 使用场景/示例 |
---|
set(<variable> <value> [CACHE TYPE <docstring>]) | 设置变量 | set(SOURCES src/main.cpp src/utils.cpp) | 定义源文件列表变量 SOURCES |
unset(<variable>) | 删除变量 | unset(SOURCES) | 清除变量 SOURCES |
list(APPEND/REMOVE/...) | 操作列表变量 | list(APPEND SOURCES src/extra.cpp) | 向 SOURCES 添加新文件 |
option(<option_name> "<help_text>" [default_value]) | 定义配置选项 | option(ENABLE_TEST "Enable tests" ON) | 用户可通过 -DENABLE_TEST=OFF 关闭测试 |
文件与目录管理
命令/函数 | 说明 | 参数示例 | 使用场景/示例 |
---|
include_directories([AFTER/BEFORE] [dirs...]) | 添加头文件搜索路径(全局) | include_directories(include/) | 已弃用,推荐使用 target_include_directories |
target_include_directories(<target> [INTERFACE/PUBLIC/PRIVATE] [dirs...]) | 为目标添加头文件路径 | target_include_directories(mylib PUBLIC include/) | 现代 CMake 推荐方式,指定库的头文件路径 |
add_subdirectory(<dir>) | 添加子目录并处理其 CMakeLists.txt | add_subdirectory(src) | 递归构建子项目 |
file(GLOB <variable> [<patterns>...]) | 匹配文件到变量 | file(GLOB SOURCES "src/*.cpp") | 收集所有 .cpp 文件到 SOURCES (慎用,需手动维护) |
条件与流程控制
命令/函数 | 说明 | 参数示例 | 使用场景/示例 |
---|
if()/elseif()/else()/endif() | 条件判断 | if(UNIX AND NOT APPLE) | 平台特定逻辑:
if(WIN32)
add_definitions(-DWINDOWS)
endif() |
foreach(<var> IN [ITEMS/LISTS])...endforeach() | 循环遍历列表 | foreach(file IN LISTS SOURCES)
message("File: ${file}")
endforeach() | 遍历源文件列表并打印 |
while()...endwhile() | 循环直到条件不满足 | set(i 0)
while(i LESS 5)
math(EXPR i "${i} + 1")
endwhile() | 循环计数(较少使用) |
查找与依赖管理
命令/函数 | 说明 | 参数示例 | 使用场景/示例 |
---|
find_package(<PackageName> [version] [REQUIRED]) | 查找外部依赖包 | find_package(OpenCV 4.0 REQUIRED) | 查找 OpenCV 并链接:
target_link_libraries(app PRIVATE OpenCV::OpenCV) |
find_library(<VAR> <name> [PATHS...]) | 查找库文件路径 | find_library(MATH_LIB m) | 查找数学库 libm.so (Linux) |
find_path(<VAR> <name> [PATHS...]) | 查找头文件路径 | find_path(JSON_INCLUDE json/json.h) | 查找 JSON 头文件路径 |
安装与打包
命令/函数 | 说明 | 参数示例 | 使用场景/示例 |
---|
install(TARGETS <targets...> DESTINATION <dir>) | 安装构建目标 | install(TARGETS app DESTINATION bin) | 将可执行文件安装到 bin 目录 |
install(FILES <files...> DESTINATION <dir>) | 安装文件 | install(FILES config.ini DESTINATION etc) | 安装配置文件到 etc |
install(DIRECTORY <dir> DESTINATION <dir>) | 安装目录 | install(DIRECTORY include/ DESTINATION include) | 安装头文件目录 |
其他常用命令
命令/函数 | 说明 | 参数示例 | 使用场景/示例 |
---|
message([STATUS/WARNING/FATAL_ERROR] "message") | 输出信息 | message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") | 调试或状态提示 |
add_custom_command(...) | 添加自定义构建规则 | add_custom_command(OUTPUT preprocessed.cpp COMMAND gcc -E main.cpp > preprocessed.cpp) | 生成预处理文件 |
add_custom_target(<name> [COMMAND ...]) | 定义自定义目标(如伪目标) | add_custom_target(run ALL COMMAND ./app) | 构建后自动运行程序 |
示例场景
1. 基础项目
cmake_minimum_required(VERSION 3.10)
project(MyApp LANGUAGES CXX)
add_executable(app main.cpp)
target_include_directories(app PRIVATE include/)
target_link_libraries(app PRIVATE Threads::Threads)
2. 使用外部库(如 OpenCV)
find_package(OpenCV REQUIRED)
add_executable(demo demo.cpp)
target_link_libraries(demo PRIVATE OpenCV::core OpenCV::highgui)
3. 条件编译
option(USE_CUDA "Enable CUDA support" OFF)
if(USE_CUDA)
find_package(CUDA REQUIRED)
add_library(gpu_lib STATIC gpu_kernel.cu)
endif()
注意:
- 现代 CMake 推荐使用 目标级别命令(如
target_include_directories
而非 include_directories
)。 - 作用域关键词
PRIVATE
、PUBLIC
、INTERFACE
用于控制依赖传递性。 - 更多命令请参考 CMake 官方文档。