开始
CMake 是一个跨平台的开源构建系统工具,旨在简化软件项目的构建过程
通过使用简单的配置文件(CMakeLists.txt),CMake 能够生成标准化的构建文件(如 Makefile 或 Visual Studio 工程文件),使得开发者可以在不同的平台和编译器上方便地管理项目构建
CMakeLists 语法
CMake 依赖 CMakeLists.txt 文件来构建
变量
获取变量:${variable_name}
变量有预定义变量和自定义变量
预定义变量:获取环境变量 $ENV{variable}
设置变量:set()、unset()
set(variable_name value1 value2),传入多个值时作为一个 listunset():销毁变量
设置和销毁环境变量
set(ENV{varaible} value)unset(ENV{varaible})
列表操作
创建列表
set(list_name value1 value2)list(APPEND list_name value1 value2)list(APPEND <list> [<element>...]):列表添加元素list(REMOVE_ITEM <list> <value>[value...]):列表删除元素list(LENGTH <list> <output variable>):获取列表元素个数list(FIND <list> <value> <out-var>):在列表中查找元素返回索引list(INSERT <list> <index> [<element>...]):在index位置插入list(REVERSE <list>):反转列表list(SORT <list>[...]):排序列表
流程控制
if-else
1 | if (<condition>) |
for 循环
1 | foreach(<loop_var> RANGE <max>) |
while 循环
1 | while(<condition>) |
函数
1 | function(func_name arg1 arg2) |
project(name c cxx):指定工程名和支持的语言,该关键字同时声明了两个变量,<project_name>_BINARY_DIR和<project_name>_SOURCE_DIR,可以使用统一的PROJECT_BINARY_DIR和PROJECT_SOURCE_DIRmessage("message"):在终端输出信息
作用域
- Function 作用域
- Directory 作用域:父文件夹中 CMakeLists 的变量可以在子文件夹 CMakeLists 中使用
宏
1 | macro(macro_name arg...) |
构建
- 在项目文件夹下创建 build 文件夹,进入 build 文件夹,
cmake ..创建工程,编译的临时文件会在 build 文件夹中 - 调用子目录的 cmake 脚本:使用
include导入子目录的 cmake 文件,可以使用其中的变量 add_subdirectory:在父目录中添加直接子目录,识别子目录中的 cpp
生成目标
add_executable:生成可执行文件,在最顶层目录将 main.cpp 生成可执行文件add_library:生成库文件,包含所有 cpp
添加头文件搜索路径
-
target_include_directories:在特定目标中添加头文件路径,在 cpp 中 include 时不需要从当前相对路径开始包含在该目标中的所有源文件都共享该路径
-
include_directories:当前目录中的所有目标及其子目录中的目标共享该路径
链接库
target_link_libraries:将通过add_library生成的库链接到目标
e.g
在 main 目录中包含 lib1 和 lib2 两个目录,在 lib2 中包含 lib3 目录,lib1 和 lib2 引用 lib3,lib2 引用 lib1,main 引用 lib2

1 | # main/CMakeLists.txt |
1 | # lib2/CMakeLists.txt |
1 | # lib1/CMakeLists.txt |
1 | # lib3/CMakeLists.txt |
库
静态库:在编译时将库一起链接打包到可执行文件中,后缀为 .a/.lib
动态库:在运行时将目标库链接到程序中,后缀为 .so/.dll
file:搜索源文件add_library(STATIC):生成静态库add_library(SHARED):生成动态库${LIBRARY_OUTPUT_PATH}:设置库的导出目录