CMake 构建类型没有区别

Omr*_*oth 2 cmake

我在 C++ 领域工作了很多年,但对 CMake 还很陌生。

我用构建我的应用程序

cmake --build build_dir --config Debug --target all -- -j 1
Run Code Online (Sandbox Code Playgroud)

这工作正常并构建调试版本。

如果我将 --config 更改为其他内容,例如使用以下命令发布:

cmake --build build_dir --config Release --target all -- -j 1
Run Code Online (Sandbox Code Playgroud)

忍者说“没有工作可做”并退出。运行编译后的应用程序,它显然没有得到优化。此 Cmake 项目中还有两个其他选项,RelWithDebug 和 MinSizeRel,它们的作用相同。

在CmakeLists.txt中有:

set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")
Run Code Online (Sandbox Code Playgroud)

还有很多其他提到的各种类型,但目前对我来说都有点希腊语。

我该怎么做才能找出问题出在哪里?

小智 17

我将为您提供全面深入的答案。以防万一其他人有这种困惑。

什么是发电机

本质上,生成器是 CMake 创建的构建系统。CMake 不会直接构建您的项目。因为CMake是一个元构建系统。IE CMake 是一个构建系统,可以“生成”您真正的构建系统。这就是为什么它被称为“发电机”。

“Visual Studio 16 2019”旨在在 1 个构建中处理多个配置。

在此输入图像描述

这就是为什么当您打开由 CMake 创建的 Visual Studio 项目时,您可以轻松地在“调试”、“发布”等之间进行更改。

其中“Unix Makefiles”和“Ninja”一次只能处理 1 个配置类型。

构建系统能力的这种差异导致运行 CMake 时 CLI 略有不同。

Visual Studio 16 2019(多配置)

如前所述,Visual Studio 在构建中支持多种配置类型。

cmake -S . -B build/vs -G "Visual Studio 16 2019"

cmake --build build/vs --config Debug
cmake --build build/vs --config Release
Run Code Online (Sandbox Code Playgroud)

在第一个命令中,您将创建 Visual Studio 2019 项目。

在第二个命令中,您实际上正在构建二进制文件。由于 Visual Studio 项目是多配置的,因此您不需要为每种类型使用不同的构建文件夹。因为 Visual Studio 会为您处理它!

忍者(单配置)

cmake -S . -B build/ninja/ -G "Ninja" -D CMAKE_BUILD_TYPE=Debug
cmake --build build/ninja/

# Now I've updated the project to make Release binaries
cmake -S . -B build/ninja/ -D CMAKE_BUILD_TYPE=Release
cmake --build build/ninja/
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,您创建了一个用于调试构建的 Ninja 项目。然后你构建它。

然后,您为发布版本创建一个 Ninja 项目。然后你构建它。

请注意,您必须自己手动为每种类型指定 2 个构建文件夹。

Ninja 多重配置(CMake 3.17 中的新增功能)

得益于 Ninja 和 CMake 的进步,您可以避免在项目创建时指定构建类型的麻烦。所以现在它就像 Visual Studio 一样。

因此,现在您可以创建一个“Ninja Multi-Config”项目,而不仅仅是“Ninja”项目。

cmake -S . -B build/nin -G "Ninja Multi-Config"

cmake --build build/nin --config Debug
cmake --build build/nin --config Release
Run Code Online (Sandbox Code Playgroud)

进一步阐述

单一配置与多重配置

如何判断您的发电机是多发电机还是单发电机?

阅读文档。或者,如果您需要在脚本中进行检查,则可以通过编程方式进行检查。

可以查询全局属性GENERATOR_IS_MULTI_CONFIG

CMAKE_BUILD_TYPE

需要提到的一件小事是 CMAKE_BUILD_TYPE 在多配置生成器上不执行任何操作。因此,请避免在 CMake 代码中使用它。

请参阅此答案:CMAKE_BUILD_TYPE is not being used in CMakeLists.txt