安装与新建工程 (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, 好丑的图.