此文为:轻松入门cmake系列教程
编写代码
mycmake$ tree
.
├── CMakeLists.txt
├── main.cpp
- main.cpp内容如下:
#include <cstdlib>
#include <iostream>
#include <string>
std::string say_hello() { return std::string("Hello, CMake world!"); }
int main() {
std::cout << say_hello() << std::endl;
return EXIT_SUCCESS;
}
- CMakeLists.txt
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(recipe-01 LANGUAGES CXX)
add_executable(hello-world main.cpp)
实验一:使用默认生成器编译
(1)创建一个build目录,在build目录下配置项目
$ cmake -H. -Bbuild
我们来看下,可以看到多出来一个build目录,看下build目录生成了什么东西:
$ ls -l
总用量 32
-rw-rw-r-- 1 oceanstar oceanstar 12307 5月 25 14:41 CMakeCache.txt
drwxrwxr-x 5 oceanstar oceanstar 4096 5月 25 14:41 CMakeFiles
-rw-rw-r-- 1 oceanstar oceanstar 1600 5月 25 14:41 cmake_install.cmake
-rw-rw-r-- 1 oceanstar oceanstar 5180 5月 25 14:41 Makefile
理论: 为什么会生成这些东西呢?
cmake是一个构建系统生成器。将描述构建系统(如:Unix Makefile、Ninja、Visual Studio等)应当如何才能编译代码。然后cmake为所选的构建系统生成响应的指令。默认情况下,在GNU/Linux和macOS系统上,CMake使用Unix Makefile生成器。Windows上,Visual Studio是默认的生成器。
GNU/Linux上,CMake默认生成Unix Makefile来构建项目:
- CMakeCache.txt:如文件名所示,CMake缓存。CMake在重新运行配置时使用这个文件
- CMakeFiles:包含临时文件的目录,CMake用于检测操作系统、编译器等。此外,根据所选的生成器,它还包含特定的文件。
- cmake_install.cmake:处理安装规则的CMake脚本,在项目安装时使用。
- Makefile: make将运行指令来构建项目。
理论:
cmake -H. -Bbuild
是什么意思
cmake -H. -Bbuild
相当于如下命令
$ mkdir -p build
$ cd build
$ cmake ..
为什么要有这个命令?
- 该命令是跨平台的,使用了-H和-B为CLI选项。-H表示当前目录中搜索根CMakeLists.txt文件。-Bbuild告诉CMake在一个名为build的目录中生成所有的文件。
(2)然后我们来编译出可执行文件
$ cd build
$ cmake --build .
我们来看下,生成了什么东西:
$ ls -l
总用量 52
-rw-rw-r-- 1 oceanstar oceanstar 12307 5月 25 14:41 CMakeCache.txt
drwxrwxr-x 5 oceanstar oceanstar 4096 5月 25 14:44 CMakeFiles
-rw-rw-r-- 1 oceanstar oceanstar 1600 5月 25 14:41 cmake_install.cmake
-rwxrwxr-x 1 oceanstar oceanstar 16736 5月 25 14:44 hello-world
-rw-rw-r-- 1 oceanstar oceanstar 5180 5月 25 14:41 Makefile
可以看出,多出来一个二进制文件,可以用来执行
$ ./hello-world
理论:
cmake --build .
是什么意思
相当于:
make
小结:操作步骤如下:
$ cmake -H. -Bbuild
$ cd build
$ cmake --build .
$ ./hello-world
实验二:切换生成器
查询生成器
(1)CMake针对不同平台支持本地构建工具列表。同时支持命令行工具(如Unix Makefile和Ninja)和集成开发环境(IDE)工具。用以下命令,可在平台上找到生成器名单,以及已安装的CMake版本:
$ cmake --help
这个命令的输出,将列出CMake命令行界面上所有的选项,您会找到可用生成器的列表。比如:
Generators
The following generators are available on this platform (* marks default):
* Unix Makefiles = Generates standard UNIX makefiles.
Green Hills MULTI = Generates Green Hills MULTI files
(experimental, work-in-progress).
Ninja = Generates build.ninja files.
Watcom WMake = Generates Watcom WMake makefiles.
CodeBlocks - Ninja = Generates CodeBlocks project files.
CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
CodeLite - Ninja = Generates CodeLite project files.
CodeLite - Unix Makefiles = Generates CodeLite project files.
Sublime Text 2 - Ninja = Generates Sublime Text 2 project files.
Sublime Text 2 - Unix Makefiles
= Generates Sublime Text 2 project files.
Kate - Ninja = Generates Kate project files.
Kate - Unix Makefiles = Generates Kate project files.
Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.
下面我们来切换生成器编译器目录试一试
切换生成器
$ mkdir -p build
$ cd build
$ cmake -G Ninja ..
错误:
CMake Error: CMake was unable to find a build program corresponding to "Ninja". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
-- Configuring incomplete, errors occurred!
原因:
- 没有安装Ninja
解决方式
sudo apt-get update -y
sudo apt-get install -y ninja-build
然后重新执行:
$ cmake -G Ninja ..
$ ls -l
总用量 40
-rw-rw-r-- 1 oceanstar oceanstar 12804 5月 25 15:02 build.ninja
-rw-rw-r-- 1 oceanstar oceanstar 12217 5月 25 15:02 CMakeCache.txt
drwxrwxr-x 5 oceanstar oceanstar 4096 5月 25 15:02 CMakeFiles
-rw-rw-r-- 1 oceanstar oceanstar 1600 5月 25 15:02 cmake_install.cmake
-rw-rw-r-- 1 oceanstar oceanstar 1963 5月 25 15:02 rules.ninja
与前一个配置相比,每一步的输出没什么变化。每个生成器都有自己的文件集,所以编译步骤的输出和构建目录的内容是不同的:
- build.ninja和rules.ninja:包含Ninja的所有的构建语句和构建规则。
- CMakeCache.txt:CMake会在这个文件中进行缓存,与生成器无关。
- CMakeFiles:包含由CMake在配置期间生成的临时文件。
- cmake_install.cmake:CMake脚本处理安装规则,并在安装时使用。
$ cmake --build .
$ ./hello-world
- cmake --build .将ninja命令封装在一个跨平台的接口中。