我在 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 在构建中支持多种配置类型。
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 的进步,您可以避免在项目创建时指定构建类型的麻烦。所以现在它就像 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 代码中使用它。
请参阅此答案:CMAKE_BUILD_TYPE is not being used in CMakeLists.txt
| 归档时间: |
|
| 查看次数: |
2326 次 |
| 最近记录: |