CMake带调试信息编译方法及CMAKE_BUILD_TYPE不生效问题排查
核心原因
出现CMAKE_BUILD_TYPE未被项目使用的警告,核心是Windows环境下CMake默认调用多配置生成器(最常见的是Visual Studio生成器,也包含Ninja Multi-Config这类),这类生成器和Linux/macOS下常用的单配置生成器(Unix Makefiles、单配置Ninja)规则存在本质区别:
- 单配置生成器:仅支持在配置阶段固定唯一构建类型,必须通过
-DCMAKE_BUILD_TYPE=xxx参数指定,配置完成后只能编译对应类型的产物 - 多配置生成器:配置阶段会一次性生成Debug、Release、RelWithDebInfo等所有构建类型的工程规则,构建类型是编译阶段才需要指定的参数,配置阶段传入
CMAKE_BUILD_TYPE不会被识别,因此会弹出变量未使用的警告。
之前可正常运行的cmake --build . --config RelWithDebInfo写法完全符合规范,是多配置生成器下指定构建类型的标准写法。配置完成后找不到exe,一方面是仅执行了配置步骤未执行编译步骤,另一方面是多配置生成器的产物存放路径和单配置生成器存在差异。
正确操作步骤
编译Debug版本不需要在配置阶段传入CMAKE_BUILD_TYPE参数,按以下两步操作即可:
- 执行配置命令(如果之前生成过错误缓存,先删除目录下的
CMakeCache.txt文件和CMakeFiles文件夹再执行):
cmake .
- 执行编译命令,通过
--config参数指定Debug构建类型:
cmake --build . --config Debug
产物路径说明
多配置生成器不会把编译好的exe直接放在构建根目录,会按构建类型存放在对应名称的子文件夹中:
- Debug版本exe存放在输出目录的
Debug子文件夹下 - RelWithDebInfo、Release版本的产物分别存放在同名的
RelWithDebInfo、Release子文件夹下
直接在构建根目录查找无法定位到对应exe文件。
补充说明:如果确实想在配置阶段通过CMAKE_BUILD_TYPE固定构建类型,需要在配置时显式指定使用单配置生成器(比如NMake Makefiles、单配置Ninja)。但Windows下使用默认的Visual Studio多配置生成器时,直接在编译阶段传入--config参数即可,同一构建目录可以随时切换不同构建类型编译,不需要重复配置,使用灵活性更高。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

