带有 XCode 目标的 CMake,生成忽略发布配置的调试符号设置

Posted

技术标签:

【中文标题】带有 XCode 目标的 CMake,生成忽略发布配置的调试符号设置【英文标题】:CMake with XCode target, generate debug symbols setting ignored for Release config 【发布时间】:2018-04-06 14:37:27 【问题描述】:

我正在尝试为我的发布配置生成一个 dSYM 文件。在我的 CMake 配置中,我有:

if (CMAKE_GENERATOR STREQUAL "Xcode")
  # generate debug symbols in a .dsym file for release mode
  set(CMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS[variant=Release] 
      "YES")
  set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Release] 
      "dwarf-with-dsym")
  # strip symbols from final executable
  set(CMAKE_XCODE_ATTRIBUTE_DEPLOYMENT_POSTPROCESSING[variant=Release] 
      "YES")
endif()

调试信息格式和部署后处理都用于发布配置。但是,XCode 接口中的Generate Debug Symbols / xxx.xcodeproj/project.pbxproj 文件中的GCC_GENERATE_DEBUGGING_SYMBOLS 设置为NO 用于Release 配置。

删除[variant=Release] 限制对发布配置没有影响。如果我手动打开 Release 中的设置,我会得到想要的结果。如何让 CMake 使用此设置为发布配置创建 Xcode 项目?

我不想使用RelWithDebInfo,因为它的优化设置较低(-O2 而不是-O3)。我想要 .dSYM 文件来调试现场崩溃。

【问题讨论】:

【参考方案1】:

尽管我建议将 target_compile_options 与生成器表达式一起使用,但您必须求助于修改 CMAKE_CXX_FLAGS

target_compile_options(your_exe PRIVATE
    $<$<CXX_COMPILER_ID:Clang>:-g>
    )

【讨论】:

这成功了,虽然我的情况是用于通用配置,所以我使用了 add_compile_options 和适当的生成器表达式。【参考方案2】:

使用运行xcrun dsymutil $&lt;TARGET_FILE:your_target&gt; -o $&lt;TARGET_DIR:your_target&gt;/blah.dSYM 的使用add_custom_command 的后期构建脚本。

这有一个缺点,即即使代码没有任何变化,该脚本也将始终运行。使用它作为 Xcode 构建过程的一个步骤可以消除冗余运行。好处是所有生成器都可以使用它。

https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html https://cmake.org/cmake/help/latest/command/add_custom_command.html?highlight=post_build

【讨论】:

以上是关于带有 XCode 目标的 CMake,生成忽略发布配置的调试符号设置的主要内容,如果未能解决你的问题,请参考以下文章

带有外部工具链的Buildroot的CMake工具链文件

CMake:生成忽略错误的 Unix Makefile

CMake为Xcode目标与正常目标

Xcode自动补全不适用于通过CMake包含的C ++库

macOS使用CMake生成Xcode工程

如何让 CMake 创建一个 xcode 项目,其中警告在系统标头中被抑制?