CMake生成Xcode项目时Release配置下Generate Debug Symbols设置异常
排查CMake生成Xcode项目时单个库Release配置不生成dSYM的思路
检查异常库的CMake配置覆盖
- 排查该库的CMakeLists.txt中是否存在针对Release配置的单独设置:比如是否用
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -g0")关闭了调试符号,或者将CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT重新设置为dwarf等其他值。 - 确认是否通过
target_compile_options给这个库的Release配置单独添加了覆盖-g的编译选项,例如target_compile_options(your_lib PRIVATE $<$<CONFIG:RELEASE>:-g0>)。 - 检查是否存在
CMAKE_BUILD_TYPE或XCODE_GENERATE_SCHEME相关的特殊配置,导致该库的Release配置被单独处理。
- 排查该库的CMakeLists.txt中是否存在针对Release配置的单独设置:比如是否用
查看目标属性的实际值
在该库的CMakeLists.txt中添加以下代码,重新生成项目并查看控制台输出,确认属性是否符合预期:get_target_property(DEBUG_INFO_FORMAT your_library_target DEBUG_INFORMATION_FORMAT) message(STATUS "[your_lib] DEBUG_INFORMATION_FORMAT: ${DEBUG_INFO_FORMAT}") get_target_property(CXX_COMPILE_FLAGS your_library_target COMPILE_FLAGS) message(STATUS "[your_lib] COMPILE_FLAGS: ${CXX_COMPILE_FLAGS}") get_target_property(CXX_FLAGS_RELEASE your_library_target CXX_FLAGS_RELEASE) message(STATUS "[your_lib] CXX_FLAGS_RELEASE: ${CXX_FLAGS_RELEASE}")重点关注Release配置下的属性值,看是否被意外修改。
验证CMake与Xcode版本兼容性
- 部分旧版本CMake对Xcode属性的多配置支持不完善,尝试针对不同配置单独设置属性:
set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Debug] "dwarf-with-dsym") set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Release] "dwarf-with-dsym") set(CMAKE_XCODE_ATTRIBUTE_GENERATE_DEBUG_SYMBOLS[variant=Debug] YES) set(CMAKE_XCODE_ATTRIBUTE_GENERATE_DEBUG_SYMBOLS[variant=Release] YES) - 确认Xcode版本是否支持当前配置逻辑,部分旧Xcode版本对dSYM生成的触发条件有差异。
- 部分旧版本CMake对Xcode属性的多配置支持不完善,尝试针对不同配置单独设置属性:
检查库的目标类型与特殊属性
- 确认该库是
SHARED还是STATIC类型,部分场景下静态库的调试符号配置可能被特殊处理;检查是否设置了POSITION_INDEPENDENT_CODE、RELEASE_POSTFIX等可能间接影响调试符号的属性。 - 排查是否通过
set_target_properties对该库设置了覆盖全局配置的属性,例如set_target_properties(your_lib PROPERTIES DEBUG_INFORMATION_FORMAT "dwarf")。
- 确认该库是
确认全局配置的作用范围
检查该库的CMakeLists.txt中是否存在project()命令,该命令会重置部分CMAKE全局变量,导致根目录设置的CMAKE_CXX_FLAGS和CMAKE_XCODE_ATTRIBUTE_*被覆盖。如果存在,需将全局配置移到该project()命令之后,或者避免在子库中重复调用project()。直接对比Xcode项目文件的差异
右键异常库所在的xcodeproj文件,选择「Show Package Contents」,打开project.pbxproj:- 搜索该库Release配置下的
GENERATE_DEBUG_SYMBOLS和DEBUG_INFORMATION_FORMAT字段,对比正常库的配置值; - 如果异常库的
GENERATE_DEBUG_SYMBOLS = NO;,则说明CMake生成时未正确传入该配置,可反推是哪条CMake语句导致了这个结果。
- 搜索该库Release配置下的
简化配置逐步定位问题
将该库的CMakeLists.txt简化到最基础形式(仅保留add_library和源文件引用),添加全局的dSYM配置后重新生成项目。如果问题消失,再逐步加回原有的配置项,每添加一项就重新生成并验证,以此定位导致问题的具体配置。
内容的提问来源于stack exchange,提问作者shaunwick
相关产品推荐
相关产品推荐

