cmake 是一个会生成 Makefile,然后通过 Makefile 管理来对代码进行编译的流程。那么我们为什么用 cmake 而不是直接去写 Makefile 这是因为其具有以下几个优点
- 易于维护
- 提高效率
- 跨平台
CMake
在 CMake 中几个主要概念,只要理解好了这个结果
- target
- multiple layers
- Modules
我们先写一个 cpp 的 helloworld 然后用 cmake 对其进行编译,创建一个目录后在其下面新建一个 main.cpp 文件,然后输入如下一个 hello world 的代码
#include <iostream>
using namespace std;
int main()
{
cout << "hello world" << endl;
}
然后在 main.cpp 同级目录下创建一个 CMakeLists.txt 文件,大家注意文件名需要保持一致,大小写和单词单复数需要保持一致。
cmake_minimum_required(VERSION 3.2)
project(demoone VERSION 1.0.0 LANGUAGES CXX)
add_executable(demoone main.cpp)
创建好了 CMakeLists.txt 文件后,我们就可以基于这个文件来编译,首先我们在项目目录下,也就是 main.cpp 同级目录下创建一个 build 文件夹,然后 cd 到这个文件夹下,执行 cmake .. 执行成功后,我们在用 make 命令来编译项目,得到我们想要可执行文件 demoone 来执行就可以看效果。
这里为什么要创建一个 build 文件夹呢? 因为在构建过程中会产生大量临时文件,为了让项目结构更加清晰,而且每次重新构建时候可以将上一次构建文件进行删除,所以创建了一个 build 文件夹主要用于放置构建过程产生临时文件,让项目看起来更加清晰。
关于 build 文件设置位置,其实也可以在 home 下建立一个文件夹 src 用于放置你的各个项目,然后在 home 下创建 build 文件夹,在这个文件夹下放置各个项目对应的
可以安装一些可视化工具例如 cmake-qt-gui 来对配置进行可视化
为了对一些指令进行说明,这里我们在上面 CMakeLists.txt 基础进行进一步修改,然后在对出现的每一个指令进行解释说明。
cmake_minimum_required(VERSION 3.2)
project(demoone VERSION 1.0.0 LANGUAGES CXX)
set(SRC_LIST main.cpp)
MESSAGE(STATUS "this binary dir " ${demoone_BINARY_DIR})
add_executable(demo ${SRC_LIST})
结构是指令例如 project、set MESSAGE 这些都是指令,然后紧跟着一对圆括号,其中放置的是参数。
project(demoone VERSION 1.0.0 LANGUAGES CXX)
PROJECT
创建一个项目,参数需要给出项目名称,参数间用空格进行区分,随后为项目版本、语言 CXX 表示编译语言为 cpp ,这个命令会隐式创建两个变量分别为 <projectname>_BINARY_DIR 和 <projectname>_SRC_DIR 变量值都是项目存放目录
SET
set 用于设置变量,参数变量名和变量值。为变量指定值,通常是可以加双引号或者不加双引号,所以上面也可以写出 set(SRC_LIST "main.cpp") 这种形式,但是当变量中存在空格,则需要加上双引号,这一点大家需要注意。
MESSAGE
message 输出用户自定义的信息,第一个参数为 message 类型取值分别为 SEND_ERROR、STATUS 和 FATAL_ERROR
- SEND_ERROR
- STATUS
- FATAL_ERROR 当为此类型这回终止 cmake 的过程
ADD_EXECUTABLE
输出可执行文件第一个参数为可执行文件名称,注意项目名称和可执行文件名之间并不存在任何关系。在第二个参数值用到上面定义好的变量,关于变量取值可以通过 ${变量名} 对其进行取值。