文章目录
- 1.说明
- 1.1 Debug 配置
- 1.2 Release 配置
- 1.3 MinSizeRel 配置
- 1.4 RelWithDebInfo 配置
 
- 2.提供的编译类型
- 3.示例
- 结论
 
1.说明
CMake作为一款强大的构建系统,提供了多种编译配置选项。这些配置影响编译过程中的优化级别和调试信息的包含情况。以下是CMake提供的主要编译类型及其特点:
1.1 Debug 配置
-  目的:用于开发和调试阶段。 
-  特点: - 包含详细的调试信息,例如变量的跟踪和函数调用信息。
- 不进行代码优化,以保证调试的准确性。
- 生成的二进制文件体积较大,执行速度较慢。
 
1.2 Release 配置
-  目的:用于生产环境的发布。 
-  特点 : - 进行全面的代码优化,包括性能和内存优化。
- 不包含调试信息,减少二进制文件的体积。
- 生成的二进制文件执行速度快,但不便于调试。
 
1.3 MinSizeRel 配置
-  目的:生成最小体积的二进制文件。 
-  特点 : - 优化目标是减少最终生成文件的体积。
- 不包含调试信息。
- 适用于对程序大小有严格限制的场景,如嵌入式系统。
 
1.4 RelWithDebInfo 配置
-  目的:在提供一定程度的优化的同时,还包含调试信息。 
-  特点 : - 在保证一定优化水平的基础上,包含部分调试信息。
- 适合性能测试时的调试使用。
- 二进制文件体积和执行速度介于Debug和Release配置之间。
 
2.提供的编译类型
- Release:使用-O3 -DNDEBUG标志,进行最大优化,不包含调试信息。
- Debug:使用-g标志,包含调试信息,不进行优化。
- MinSizeRel:使用-Os -DNDEBUG标志,优化二进制文件大小,不包含调试信息。
- RelWithDebInfo:使用-O2 -g -DNDEBUG标志,提供优化和调试信息。
3.示例
- 项目结构
 |-📁prj06
   |-- 🎴CMakeLists.txt
   |-- 📄main.cpp
- CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(build_type)if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)message("Setting build type to 'RelWithDebInfo' as none was specified.")set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif()add_executable(cmake_examples_build_type main.cpp)
- main.cpp
#include <iostream>int main(int argc, char *argv[])
{std::cout << "Hello Build Type!" << std::endl;return 0;
}
- 设置编译类型
编译类型可以通过以下两种方法设置:
-  使用 cmake-gui:在cmake-gui界面中选择所需的构建类型。 
-  使用命令行:传递编译类型到CMake配置。 cmake .. -DCMAKE_BUILD_TYPE=Release
- 设置默认编译类型
  
 在项目的CMakeLists.txt中,可以设置一个默认的编译类型,以防没有指定:
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)message("Setting build type to 'RelWithDebInfo' as none was specified.")set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE)set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif()
结论
正确理解和使用CMake中的编译类型对于软件项目的开发、调试和发布至关重要。选择合适的编译配置不仅能优化程序的性能,还能确保开发过程的高效性。通过在CMake中灵活配置编译类型,可以有效地管理项目的构建过程,满足不同阶段的需求。