CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的 makefile 或者 project 文件,能测试编译器所支持的 C++ 特性,类似 UNIX 下的 automake。

CMake 的学习资料较少,只能通过 github 的各种例子进行学习。不过仍然建议在学习之前看一下《CMake实践》这本中文书。

一、文件树

  1. ├── CMakeLists.txt
  2. ├── main.cpp

二、main.cpp

  1. #include <iostream>
  2. int main(int argc, char *argv[])
  3. {
  4. std::cout << "Hello CMake!" << std::endl;
  5. return 0;
  6. }

三、CMakeLists.txt

cmake_minimum_required(VERSION 3.5)            # 设置 CMake 最小版本
project(hello_cmake)                        # 设置工程名
add_executable(hello_cmake main.cpp)        # 生成可执行文件

四、解析

4.1 命令作用解析

§ 1. hello-cmake - 图1 第二行

project (hello_cmake)             # 设置工程名
# 因为要生成工程: hello_cmake
# 所以: ${PROJECT_NAME} = hello_cmake

CMake 构建包含一个项目名称,上面的命令会自动生成一些变量,在使用多个项目时引用某些变量会更加容易。

比如生成了:PROJECT_NAME 这个变量。PROJECT_NAME 是变量名,${PROJECT_NAME} 是变量值,值为 hello_cmake。

§ 1. hello-cmake - 图2 第三行

add_executable(hello_cmake main.cpp)        # 生成可执行文件
# 第一个参数:可执行文件名 hello_cmake
# 第二个参数:编译的源文件列表 main.cpp

add_executable() 命令会指定某些源文件生成可执行文件,本例中是 main.cpp。add_executable() 函数的第一个参数是可执行文件名,第二个参数是要编译的源文件列表。

4.2 生成与工程同名的二进制文件

通过令 add_executable() 函数的第一个参数等于工程的名字 ${PROJECT_NAME},从而生成与工程同名的可执行目标文件(即二进制文件)。

cmake_minimum_required(VERSION 2.6)
project (hello_cmake)
add_executable(${PROJECT_NAME} main.cpp)        # 可执行文件名:${PROJECT_NAME}

project(hello_cmake) 函数执行时会生成一个变量,是 PROJECT_NAME${PROJECT_NAME} 表示PROJECT_NAME 变量的值为 hello_cmake,所以把 ${PROJECT_NAME} 用在 add_executable() 里可以生成可执行文件名字叫 hello_cmake

4.3 外部构建与内部构建

变量 CMAKE_BINARY_DIR 指向 cmake 命令的根文件夹,所有二进制文件在这个文件夹里产生。

4.3.1 外部构建(推荐)

使用外部构建,我们可以创建一个可以位于文件系统上任何位置的构建文件夹。 所有临时构建和目标文件都位于此目录中,以保持源代码树的整洁。

拿本例子来说:

运行下述代码,新建 build 构建文件夹,并运行 cmake 命令

mkdir build
cd build/
cmake ..                # 因为CMakeLists.txt在父目录,所以用 cmake ..

编译后的文件树如下

.
├── build
│   ├── CMakeCache.txt
│   └── CMakeFiles
│       ├── 3.18.4
│       │   ├── CMakeSystem.cmake
│       │   ├── CompilerIdC
│       │   │   ├── CMakeCCompilerId.c
│       │   │   └── tmp
│       │   └── CompilerIdCXX
│       │       ├── CMakeCXXCompilerId.cpp
│       │       └── tmp
│       ├── cmake.check_cache
│       ├── CMakeError.log
│       └── CMakeOutput.log
├── CMakeLists.txt
└── main.c

可以看到,build 文件夹下生成了许多二进制文件,如果要从头开始重新创建 cmake 环境,只需删除构建目录build,然后重新运行 cmake。 非常方便

以后使用外部构建。

4.3.2 内部构建

内部构件将所有临时文件和源文件生成到一起,没有 build,临时文件会和源代码文件在一起。(不推荐)

在 main.c 所在的目录下运行以下命令

cmake .                # CMakeLists.txt在本目录下,所以使用 .

生成的文件如下所示:

§ 1. hello-cmake - 图3

其中的 CMakeFiles 和 CMakeCache.txt 都是原来 build 文件夹里的内容