从hello world开始,逐步学习cmake。本文主要讲cmake的set和add_executable指令以及内部构建和外部构建
cmake是makefile的上层构建工具,它并不直接编译构建整个工程,而是用于构建可移植的makefile或是 Windows 的 VS 工程文件,并简化自己动手写makefile时的巨大工作量。手动写makefile往往依赖于当前编译平台,而且编写makefile的工作量比较大,解决依赖往往会让你头皮发麻。因此,对于较大项目,应当考虑使用更自动化一些的 cmake或者autotools等工具来生成makefile,而不是上来就动手编写。
目录
1 Hello CMake
从经典程序Hello wold开始
main.cpp
#include<stdio.h>
int main()
{
printf("Hello CMake \n");
}
CmakeLists.txt
add_executable(camektest main.c)
目录结构
.
├── CMakeLists.txt
└── main.c
在代码路径下开始构建(内部构建),执行cmake ./
cmake ./
等待片刻,在工程目录下将生成编译使用的MakeFile以及其他cmake配置文件
dawn@DAWN-AMD:~/workstation/cmaketest$ ls
CMakeCache.txt CMakeFiles CMakeLists.txt Makefile cmake_install.cmake main.c
此时执行make即可编译main.c
dawn@DAWN-AMD:~/workstation/cmaketest$ ls
CMakeCache.txt CMakeFiles CMakeLists.txt Makefile cmake_install.cmake cmaketest main.c
dawn@DAWN-AMD:~/workstation/cmaketest$ ./camektest
Hello CMake
2 说明与完善
CMakeLists.txt是 cmake 的构建定义文件,文件名严格区分大小写,大小写不一致不生效,执行时会报错The source directory xxx does not appea,如果工程存在多个目录,需要确保每个要管理的目录都存在一个CMakeLists.txt。(关于多目录构建,后面继续学习)。另外cmake语法不严格区分大小写,即CMakeLists.txt文件内变量或指令不区分大小写,可以大小写混搭,add_executable(camektest main.c)写成Add_ExecuTablE(camektest main.c)也是可以的, 当然,建议根据自己喜好使用统一风格
下面对add_executable指令进行说明,
基本语法:
add_executable(hello ${src_list})
使用src_list中的源文件,生成可执行文件hello,所以采用变量形式,我们的例子可以写成
set(src_list main.c)
add_executable(hello ${src_list})
set指令的语法 :
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
指令功能: 用来显式的定义变量
例子: set(src_list main.c other.c)
说明: 用变量代替值,例子中定义src_list代替后面的字符串。
当然,一般cmake会在开头加上如下内容
#设置cmake最低版本,构建环境低于设置版本时,执行cmake将报错并终止构建
cmake_minimum_required(VERSION 3.6.0)
#指定项目名称
project(Main)
3 构建文件与源文件分离--外部构建
上面的方法产生的构建文件直接生成在源文件目录,两者混在一起,不够简洁美观,下面使用外部构建,将两者分离开。
外部构建的方法也挺简单的,执行cmake的时候我们需要添加一个参数,即需要构建的目录,而生成的构建文件则放在执行cmake的当前目录,那我们只需要单独创建一个目录,再cd到新建目录执行cmake并指定需要构建的目录即可让源文件与构建文件分离,如下所示
dawn@DAWN-AMD:~/workstation/cmaketest$ tree
.
├── CMakeLists.txt
└── main.c
dawn@DAWN-AMD:~/workstation/cmaketest$ mkdir build && cd build
dawn@DAWN-AMD:~/workstation/cmaketest/build$ cmake ../
dawn@DAWN-AMD:~/workstation/cmaketest/build$ cd ..
dawn@DAWN-AMD:~/workstation/cmaketest$ tree -L 2
.
├── CMakeLists.txt
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── Makefile
│ └── cmake_install.cmake
└── main.c
这样就可以让编译文件与源文件分隔开,不仅让源文件目录看起来整洁,而且想要恢复源文件直接删掉build目录就可以了,仔细观察你会发现,无论是内部构建还是外部构建,默认构建生成的最终可执行文件都在执行cmake时所在目录,当然这个是可以在CMakeLists.txt里指定的,我们后面继续学习