CMake入门
为什么要使用CMake呢?随着工程变得庞大,构建它会有很多文件的参与,手写Makefile等构建文件变得愈发困难且容易出错,使用CMake可以简化这个过程;也许,有一个智能的IDE能够帮助你构建文件,但当你把源代码发给别人时,可能对方并没有相应的工具,只能面对源文件措手无策,或者重新编写构建文件,而如果有CMake,则能由一个文件根据不同的平台生成相应的建构档,事情就会变得轻松而愉快。
参考链接:
- CMake 如何入门? - 知乎
- BrightXiaoHan/CMakeTutorial: CMake中文实战教程 - github.com
- 如何评价 CMake? - 知乎
- CLion的CMake快速入门教程:Quick CMake Tutorial
- Visual Studio关于CMake项目的讲解:CMake projects in Visual Studio
基本的CMake项目
先从最简单的单文件做起,假设现在目录下有一个main.cpp
文件:
#include <iostream>
int main() {
std::cout << "Hello!";
}
我们可以在和源代码相同的目录下新建一个CMakeLists.txt
,然后写入这样的内容:
cmake_minimum_required(VERSION 3.13)
project(cmake_test)
set(CMAKE_CXX_STANDARD 14)
add_executable(cmake_testapp main.cpp)
这个的例子来自CLion的教程。下面是每一行的解释:
命令 | 解释 |
---|---|
cmake_minimum_required(VERSION 3.13) |
指定CMake的最低版本要求,如果不加会有警告 |
project(cmake_test) |
project 命令定义项目的名称 |
set(CMAKE_CXX_STANDARD 14) |
set 命令用来给变量赋值,这里CMAKE_CXX_STANDARD 变量用来指定所需最低的C++版本,这里要求C++版本最低为C++14 |
add_executable(cmake_testapp main.cpp) |
add_executable 会添加一个生成可执行文件的“目标(target)”,目标的名字为cmake_testapp ,其将从main.cpp 被构建(build) |
请读者留意“目标(target)”的概念,这在现代CMake中很是重要。
保存CMakeLists.txt
文件,然后在命令行中输入cmake .
,便会生成相应的构建文件。
不过通常我们不会在源代码的文件夹里直接构建,因为构建过程会生成很多文件,和源代码会在一起,显得比较杂乱。通常会新建一个目录,可以在当前目录,也可以在任何喜欢的地方,只要在这个目录下将CMakeLists.txt
的位置告诉CMake就可以,然后在这个文件夹里面执行构建的操作,称为“Out of source building”。
比如我们在当前目录下新建一个build目录,然后在其中进行构建操作。这样,因为CMakeLists.txt
的位置在上一级目录,可以用..
表示。
Unix下会默认生成Makefile,生成后使用make命令执行。
mkdir build && cd build
cmake ..
make
Windows下默认生成Visual Studio的项目文件*.vcxproj
。
也可以使用-G
命令指定生成的构建文件。如果之前生成的是其他构建文件,需要先删除构建目录下的CMakeCache.txt
。
cmake -G "MinGW Makefiles" ..
一个项目中可以有多个目标,我们可以指定多个生成可执行文件的目标。
比如我们有test1.cpp
和test2.cpp
两个cpp,它们分别会生成不同的程序。可以新建两个名为test1
和test2
的目标(名字随意),修改后的CMakeLists.txt
如下所示:
cmake_minimum_required(VERSION 3.13)
project(cmake_test)
set(CMAKE_CXX_STANDARD 14)
add_executable(test1 test1.cpp)
add_executable(test2 test2.cpp)
修改过CMakeLists.txt
之后,需要重新执行cmake
操作。如果使用的是IDE,那么可能会自动进行这个过程,或者提示用户进行这个操作。
注:使用make
时,可以用make <target>
指定要生成的目标,比如make test1
,默认全部执行。如果使用了IDE,可能会有下拉框以供选择。