cmake:切换生成器

1059 篇文章 278 订阅

此文为:轻松入门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 525 14:41 CMakeCache.txt
drwxrwxr-x 5 oceanstar oceanstar  4096 525 14:41 CMakeFiles
-rw-rw-r-- 1 oceanstar oceanstar  1600 525 14:41 cmake_install.cmake
-rw-rw-r-- 1 oceanstar oceanstar  5180 525 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 525 14:41 CMakeCache.txt
drwxrwxr-x 5 oceanstar oceanstar  4096 525 14:44 CMakeFiles
-rw-rw-r-- 1 oceanstar oceanstar  1600 525 14:41 cmake_install.cmake
-rwxrwxr-x 1 oceanstar oceanstar 16736 525 14:44 hello-world
-rw-rw-r-- 1 oceanstar oceanstar  5180 525 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 525 15:02 build.ninja
-rw-rw-r-- 1 oceanstar oceanstar 12217 525 15:02 CMakeCache.txt
drwxrwxr-x 5 oceanstar oceanstar  4096 525 15:02 CMakeFiles
-rw-rw-r-- 1 oceanstar oceanstar  1600 525 15:02 cmake_install.cmake
-rw-rw-r-- 1 oceanstar oceanstar  1963 525 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命令封装在一个跨平台的接口中。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值