CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的 makefile 或者 project 文件,能测试编译器所支持的 C++ 特性,类似 UNIX 下的 automake。
CMake 的学习资料较少,只能通过 github 的各种例子进行学习。不过仍然建议在学习之前看一下《CMake实践》这本中文书。
一、文件树
├── CMakeLists.txt
├── main.cpp
二、main.cpp
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << "Hello CMake!" << std::endl;
return 0;
}
三、CMakeLists.txt
cmake_minimum_required(VERSION 3.5) # 设置 CMake 最小版本
project(hello_cmake) # 设置工程名
add_executable(hello_cmake main.cpp) # 生成可执行文件
四、解析
4.1 命令作用解析
第二行
project (hello_cmake) # 设置工程名
# 因为要生成工程: hello_cmake
# 所以: ${PROJECT_NAME} = hello_cmake
CMake 构建包含一个项目名称,上面的命令会自动生成一些变量,在使用多个项目时引用某些变量会更加容易。
比如生成了:PROJECT_NAME
这个变量。PROJECT_NAME
是变量名,${PROJECT_NAME}
是变量值,值为 hello_cmake。
第三行
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在本目录下,所以使用 .
生成的文件如下所示:
其中的 CMakeFiles 和 CMakeCache.txt 都是原来 build 文件夹里的内容