CMake - 生成器(Generators)

一、介绍

CMake是一个构建系统生成器,可以使用单个CMakeLists.txt为不同平台上的不同工具集配置项目。您可以在CMakeLists.txt中描述构建系统必须运行的操作,以配置并编译代码。基于这些指令,CMake将为所选的构建系统(Unix Makefile、Ninja、Visual Studio等等)生成相应的指令。

CMake针对不同平台支持本地构建工具列表。同时支持命令行工具(如Unix Makefile和Ninja)和集成开发环境(IDE)工具。用以下命令,可在平台上找到生成器名单,以及已安装的CMake版本:

cmake --help

Linux系统下输出:

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.

Windows系统下输出:

Generators

The following generators are available on this platform (* marks default):
  Visual Studio 16 2019        = Generates Visual Studio 2019 project files.
                                 Use -A option to specify architecture.
* Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 12 2013 [arch] = Generates Visual Studio 2013 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 11 2012 [arch] = Generates Visual Studio 2012 project files.
                                 Optional [arch] can be "Win64" or "ARM".
  Visual Studio 10 2010 [arch] = Generates Visual Studio 2010 project files.
                                 Optional [arch] can be "Win64" or "IA64".
  Visual Studio 9 2008 [arch]  = Generates Visual Studio 2008 project files.
                                 Optional [arch] can be "Win64" or "IA64".
  Borland Makefiles            = Generates Borland makefiles.
  NMake Makefiles              = Generates NMake makefiles.
  NMake Makefiles JOM          = Generates JOM makefiles.
  MSYS Makefiles               = Generates MSYS makefiles.
  MinGW Makefiles              = Generates a make file for use with
                                 mingw32-make.
  Green Hills MULTI            = Generates Green Hills MULTI files
                                 (experimental, work-in-progress).
  Unix Makefiles               = Generates standard UNIX makefiles.
  Ninja                        = Generates build.ninja files.
  Ninja Multi-Config           = Generates build-<Config>.ninja files.
  Watcom WMake                 = Generates Watcom WMake makefiles.
  CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files.
  CodeBlocks - NMake Makefiles = Generates CodeBlocks project files.
  CodeBlocks - NMake Makefiles JOM
                               = Generates CodeBlocks project files.
  CodeBlocks - Ninja           = Generates CodeBlocks project files.
  CodeBlocks - Unix Makefiles  = Generates CodeBlocks project files.
  CodeLite - MinGW Makefiles   = Generates CodeLite project files.
  CodeLite - NMake Makefiles   = Generates CodeLite project files.
  CodeLite - Ninja             = Generates CodeLite project files.
  CodeLite - Unix Makefiles    = Generates CodeLite project files.
  Eclipse CDT4 - NMake Makefiles
                               = Generates Eclipse CDT 4.0 project files.
  Eclipse CDT4 - MinGW Makefiles
                               = Generates Eclipse CDT 4.0 project files.
  Eclipse CDT4 - Ninja         = Generates Eclipse CDT 4.0 project files.
  Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.
  Kate - MinGW Makefiles       = Generates Kate project files.
  Kate - NMake Makefiles       = Generates Kate project files.
  Kate - Ninja                 = Generates Kate project files.
  Kate - Unix Makefiles        = Generates Kate project files.
  Sublime Text 2 - MinGW Makefiles
                               = Generates Sublime Text 2 project files.
  Sublime Text 2 - NMake Makefiles
                               = Generates Sublime Text 2 project files.
  Sublime Text 2 - Ninja       = Generates Sublime Text 2 project files.
  Sublime Text 2 - Unix Makefiles
                               = Generates Sublime Text 2 project files.

二、准备代码

在这里插入图片描述

1. main.cpp:

#include <iostream>
#include <string>

std::string say_hello() 
{ 
    return std::string("Hello, CMake world!"); 
}

int main() 
{
  std::cout << say_hello() << std::endl;
  return 0;
}

2. CMakLists.txt:

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(sample_006 LANGUAGES CXX)
add_executable(hello-world main.cpp)

3. 使用 -G 切换 Ninja 生成器配置项目:

mkdir -p build
cd build
cmake -G Ninja ..

输出:
在这里插入图片描述
报找不到Ninja的错误,需要先安装Ninja

sudo apt-get install ninja-build

安装完Ninja后,再次执行:

cmake -G Ninja ..

输出:
在这里插入图片描述

4. 构建项目:

cmake --build .

输出:
在这里插入图片描述

三、总结

与不加生成器Ninja的配置相比,每一步的输出没什么变化。每个生成器都有自己的文件集,所以编译步骤的输出和构建目录的内容是不同的:

  • build.ninjarules.ninja:包含Ninja的所有的构建语句和构建规则;
  • CMakeCache.txt:CMake会在这个文件中进行缓存,与生成器无关;
  • CMakeFiles:包含由CMake在配置期间生成的临时文件;
  • cmake_install.cmake:CMake脚本处理安装规则,并在安装时使用。

cmake --build . 将ninja命令封装在一个跨平台的接口中。

<think>好的,用户现在问的是关于使用命令`cmake --build ncnn.release -j8 --config Release`的解释。首先,我需要拆解这个命令的各个部分,并理解每个参数的作用。 用户之前已经询问过CMake的基本构建流程,所以可能对CMake有一定了解。现在他们可能在使用更复杂的项目,比如ncnn,并且需要知道如何高效编译。需要确保解释清晰,特别是参数的作用和适用场景。 首先,命令中的`cmake --build`是用来触发构建过程的,后面跟的是构建目录`ncnn.release`。这可能是一个已经通过CMake配置好的构建目录,用户可能已经执行过`cmake -S . -B ncnn.release -DCMAKE_BUILD_TYPE=Release`之类的命令来生成构建系统。 接下来是`-j8`,这应该是指定并行编译的线程数,即使用8个线程来加速编译。需要说明这个参数的作用,以及如何根据用户的CPU核心数调整。 然后是`--config Release`,这里可能用户是在Windows上使用多配置的生成器,比如Visual Studio,因为在Unix系统上通常通过`-DCMAKE_BUILD_TYPE`指定配置。需要指出不同平台下的差异,避免用户混淆。 可能需要检查用户的使用场景。比如,用户是否在Windows下使用Visual Studio,或者在Linux/macOS下使用Makefile或Ninja。不同的生成器对`--config`参数的支持不同,需要说明这一点。 另外,用户可能希望了解这个命令的整体作用,即构建Release版本的ncnn,并使用多线程加速。需要分步骤解释每个参数,并给出示例说明。 还要注意可能的常见问题,比如目录是否正确存在,是否已经配置过Release配置,或者权限问题。如果用户遇到错误,可能需要检查这些点。 最后,总结这个命令的用途,并给出其他相关建议,比如清理构建目录或安装构建结果,帮助用户更全面地了解后续步骤。</think>以下是对该命令的逐层解析与操作说明: --- ### 一、命令结构解析 ```bash cmake --build ncnn.release -j8 --config Release ``` | 参数 | 作用 | 技术细节 | |------|------|----------| | `--build` | 指定构建操作入口 | 触发CMake构建流程 | | `ncnn.release` | 构建目录路径 | 必须包含已生成的构建系统文件 | | `-j8` | 并行编译线程数 | 根据CPU核心数调整(如8核) | | `--config Release` | 指定构建配置类型 | **仅适用于多配置生成器**(如Visual Studio) | --- ### 二、分步执行逻辑 1. **目录验证** ```bash ls ncnn.release/CMakeCache.txt # 检查是否已执行过cmake配置 ``` 2. **构建流程** - **Unix系统**(Makefile/Ninja): $$ \text{自动选择} \ \texttt{Release} \ \text{配置} \ (\text{需通过} \ \texttt{-DCMAKE_BUILD_TYPE=Release} \ \text{预先配置}) $$ - **Windows系统**(MSBuild): $$ \text{显式选择} \ \texttt{Release} \ \text{解决方案配置} $$ --- ### 三、典型应用场景 1. **ncnn项目构建示例** ```bash # 步骤1:生成构建系统 cmake -S . -B ncnn.release -DCMAKE_BUILD_TYPE=Release # 步骤2:执行构建命令 cmake --build ncnn.release -j8 --config Release ``` 2. **参数调优建议** - CPU核心数与`-j`参数对应关系: $$ \text{推荐值} = \text{物理核心数} \times 1.5 $$ - 多配置生成器下必须使用`--config`参数 --- ### 四、常见问题排查 1. **错误:`No such build directory`** ```bash cmake -S . -B ncnn.release # 重新创建构建目录 ``` 2. **警告:`--config ignored on non-multi-config generators`** - **原因**:Unix系统使用单配置生成器(如Makefile) - **解决方案**:改用`-DCMAKE_BUILD_TYPE=Release`初始配置 --- ### 五、扩展操作 1. **清理构建产物** ```bash cmake --build ncnn.release --target clean ``` 2. **安装编译结果** ```bash cmake --build ncnn.release --target install ``` --- ### 六、核心原理图示 ```mermaid graph LR A[源码目录] -->|cmake -S . -B build| B[构建目录] B -->|cmake --build| C[编译过程] C --> D[生成二进制文件] C --> E[生成库文件] ``` 通过此命令可高效完成大型项目(如ncnn)的Release版本构建,建议配合`ccache`工具进一步提升编译速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值