安装与新建工程 (Ubuntu)
CMake 官网下载: https://cmake.org/download/ .
找个地方解压并进入.
1 | tar -zxvf cmake-3.14.5.tar.gz |
根据目录下的 README 文件, 执行以下命令安装.
1 | ./bootstrap && make && sudo make install |
编译好慢啊...
CMake 会默认安装在 /usr/local/bin 下面.
用 CMake 编译安装 CMake
1 | cd build/ |
构建一个简单的 CMake 项目
新建一个文件夹作为项目文件夹, 新建文件 CMakeLists.txt. 以下为一个典型的配置:
1 | # 项目名称 |
在 src 文件夹写好源码后 (比如写个 hello_world.cpp), 在项目目录新建文件夹 build.
然后执行
1 | cd build/ |
在 build 文件夹下就会生成编译文件和最终的可执行文件 hello.
GitHub 优秀 CMake 项目参考
Visual Studio 对 CMake 的支持
CMake 语法
语法特性
赋值语句
1 | # 在当前及其子项目定义变量 VAR (不影响父域) |
LIST 操作
1 | # 读 |
条件语句
1 | if(<condition>) |
函数
1 | function(<func_name> [arg1 [arg2 [arg3 ...]]]) |
宏
1 | macro(<name> [arg1 [arg2 [arg3 ...]]]) |
内置函数
1 | # 确定所需 CMake 版本 (最好放在文件的最开头) |
内置变量
CMAKE_SOURCE_DIR | PROJECT_SOURCE_DIR | CMAKE_CURRENT_SOURCE_DIR | <PROJECT_NAME>_SOURCE_DIR
都指向项目的源目录的绝对路径 (CMakeLists.txt 所在的绝对路径).
CMAKE_SOURCE_DIR 指向当前最顶层项目 (父项目) CMakeLists.txt 的路径.
PROJECT_SOURCE_DIR 指向当前项目 (子项目) CMakeLists.txt 的路径.
CMAKE_CURRENT_SOURCE_DIR 指向当前正在处理的 CMakeLists.txt 的路径 (感觉和 PROJECT_SOURCE_DIR 没啥区别啊???).
<PROJECT_NAME>_SOURCE_DIR 就是指定某项目的 CMakeLists.txt 的路径. 但是当该项目还未被调用过之前, 该变量未定义.
所以当没有子项目时这几个都相同.
例如对于父项目 Outer 与子项目 Inner:
1 | # Outer/CMakeLists.txt |
在 Outer/CMakeLists.txt 中的变量值为:
CMAKE_SOURCE_DIR |
PROJECT_SOURCE_DIR |
CMAKE_CURRENT_SOURCE_DIR |
Outer_SOURCE_DIR |
Inner_SOURCE_DIR |
|---|---|---|---|---|
/.../Outer |
/.../Outer |
/.../Outer |
/.../Outer |
/.../Outer/Inner |
在 Outer/Inner/CMakeLists.txt 中的变量值为:
CMAKE_SOURCE_DIR |
PROJECT_SOURCE_DIR |
CMAKE_CURRENT_SOURCE_DIR |
Outer_SOURCE_DIR |
Inner_SOURCE_DIR |
|---|---|---|---|---|
/.../Outer |
/.../Outer/Inner |
/.../Outer/Inner |
/.../Outer |
/.../Outer/Inner |
TODO: PROJECT_SOURCE_DIR 与 CMAKE_CURRENT_SOURCE_DIR 区别.
CMAKE_BINARY_DIR | PROJECT_BINARY_DIR | CMAKE_CURRENT_BINARY_DIR | <PROJECT_NAME>_BINARY_DIR
指向工程编译发生的绝对路径. 区别同上.
如果是 in source 编译, 指的就是工程顶层目录, 即与 <?>_SOURCE_DIR 一样. 而如果是:
1 | cd build/ |
这种, 则其路径为 /.../CMake_Project/build .
踩坑
项目依赖作图 (graphviz)
生成依赖图的文件:
1 | cd build/ |
在 build/ 下生成 <graph>.dot 文件, <graph>.dot.<target> 文件和 <graph>.dot.<target>.dependers 文件.
安装 graphviz 以生成 png:
1 | sudo apt-get install graphviz |
导出依赖为图片:
1 | dot <graph>.dot -T png -o <figure>.png |
例如对于 cmake-3.14.5 项目:
1 | mkdir Build |
打开 graph.png:

emmmm, 好丑的图.