CMake:发布版本的平台独立二进制剥离

CMake: Platform independent binary stripping for release builds

如何将 gccclang 的二进制剥离作为 post 处理步骤添加到 CMake,但仅限于发布版本? MSVC 默认剥离,因此不必处理。

其中一个问题是 clang 没有 -s 编译标志,但是 gcc 不工作。

另一个想法是使用 strip 命令。 -s 开关再次存在于 Linux 但不存在于 XCode(这是 Apple 的开发工具链)。

所以最后的选择是使用 strip 命令,除了二进制文件本身之外没有任何参数,这似乎是一个不错的通用解决方案。如何在 CMake 中使用它?

CMakeadd_custom_command可以执行post构建命令如stripPROJECT_NAME 变量定义为您的目标二进制文件,例如

# Set the project name
set(PROJECT_NAME "MyProject")
project(${PROJECT_NAME})

将以下代码放在 CMakeLists.txtadd_executable 之后:

# Strip binary for release builds
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND $<$<CONFIG:release>:${CMAKE_STRIP} ${PROJECT_NAME}>)

CMAKE_STRIP 是平台 strip 实用程序的文件路径(例如 Linux 上的 /usr/bin/strip)。 $<$<CONFIG:cfg>:str> 生成器表达式在构建配置 cfg 时将扩展为 str,否则为空字符串。在这种情况下,这直接意味着“在 Release 中构建时调用 strip,否则什么也不做”。请注意,CONFIG 生成器对您的构建类型不区分大小写,并且在使用多配置生成器时会起作用。

在使用 add_custom_command 时,我遇到了包含空格的 COMMAND 生成器表达式的问题。 ARGS 选项可以使用,同时仍然通过 COMMAND 选项的生成器表达式切换自定义命令的包含:

add_custom_command(
  TARGET "${TARGET}" POST_BUILD
  DEPENDS "${TARGET}"
  COMMAND $<$<CONFIG:release>:${CMAKE_STRIP}>
  ARGS --strip-all $<TARGET_FILE:${TARGET}>
)

这导致 strip --strip-all myapp 在配置发布时被调用,但在未发布时不调用任何命令,尽管在单独的选项中指定了 args。