CMake设置CMAKE_BUILD_TYPE=RELEASE仍带调试信息的解决方法
问题根因
- 构建类型大小写不匹配:CMake对
CMAKE_BUILD_TYPE的取值是大小写敏感的,内置Release配置的正确写法是首字母大写的Release,你传入的全大写RELEASE不会匹配到内置配置,你写的$<CONFIG:RELEASE>生成器表达式完全不会触发,对应优化参数、宏定义都没生效,默认编译带-g调试信息,自然产物会带debug_info。 - 自定义裁剪命令语法错误:
add_custom_command的TARGET模式(即绑定到目标构建后执行的模式)不支持DEPENDS参数,旧版的ARGS关键字也已废弃,加上你代码里${TARGET}和前面的${TARGET_NAME}变量名不一致,直接触发语法报错。
正确操作步骤
1. 清理旧缓存,用正确参数配置CMake
先删除之前生成的build目录,避免错误缓存残留,执行命令时用正确大小写的构建类型参数:
rm -rf build mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release ..
如果是交叉编译,提前确认你的工具链文件里已经正确配置了对应架构的编译器、strip工具路径。
2. 修正CMakeLists.txt配置
优先用链接器参数直接剥离调试信息,不需要额外执行strip命令,同时把生成器表达式里的配置名改成正确大小写:
# 编译选项配置 add_compile_options( $<$<CONFIG:Debug>:-g3> $<$<CONFIG:Debug>:-Og> $<$<CONFIG:Release>:-O3> ) add_compile_definitions( $<$<CONFIG:Release>:RELEASE> ) # Release版本链接时加-s参数,直接剥离调试信息和符号表,等价于自动执行strip add_link_options($<$<CONFIG:Release>:-s>) # 你的可执行文件配置,替换成实际的目标名和源文件 set(TARGET_NAME your_app) add_executable(${TARGET_NAME} ${SOURCE_LIST})
这里的-s是GCC/Clang原生支持的链接参数,会在链接完成时直接移除所有调试信息、符号表,比事后手动调用strip兼容性更好,不会出现交叉编译时宿主机strip和目标架构不匹配的问题。
3. (可选)如果需要自定义strip逻辑,修正add_custom_command写法
如果有特殊裁剪需求要显式调用strip,按下面的写法修正语法,去掉多余的DEPENDS、ARGS参数,保持变量名一致:
add_custom_command( TARGET ${TARGET_NAME} POST_BUILD COMMAND $<$<CONFIG:Release>:${CMAKE_STRIP}> --strip-all $<TARGET_FILE:${TARGET_NAME}> VERBATIM )
验证结果
编译时加VERBOSE=1参数可以查看实际执行的编译命令,确认Release配置下存在-O3、-s参数,没有-g参数:
make VERBOSE=1
编译完成后用file命令查看产物属性,正常的Release产物会显示stripped,不存在with debug_info字样。
内容的提问来源于stack exchange,提问作者Preeti
相关产品推荐
相关产品推荐

