CMake:发布版本的平台独立二进制剥离
CMake: Platform independent binary stripping for release builds
如何将 gcc
和 clang
的二进制剥离作为 post 处理步骤添加到 CMake
,但仅限于发布版本? MSVC
默认剥离,因此不必处理。
其中一个问题是 clang
没有 -s
编译标志,但是 gcc
有 不工作。
另一个想法是使用 strip 命令。 -s
开关再次存在于 Linux
但不存在于 XCode
(这是 Apple
的开发工具链)。
所以最后的选择是使用 strip
命令,除了二进制文件本身之外没有任何参数,这似乎是一个不错的通用解决方案。如何在 CMake
中使用它?
在CMake
中add_custom_command
可以执行post构建命令如strip
。 PROJECT_NAME
变量定义为您的目标二进制文件,例如
# Set the project name
set(PROJECT_NAME "MyProject")
project(${PROJECT_NAME})
将以下代码放在 CMakeLists.txt
的 add_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。
如何将 gcc
和 clang
的二进制剥离作为 post 处理步骤添加到 CMake
,但仅限于发布版本? MSVC
默认剥离,因此不必处理。
其中一个问题是 clang
没有 -s
编译标志,但是 gcc
有
另一个想法是使用 strip 命令。 -s
开关再次存在于 Linux
但不存在于 XCode
(这是 Apple
的开发工具链)。
所以最后的选择是使用 strip
命令,除了二进制文件本身之外没有任何参数,这似乎是一个不错的通用解决方案。如何在 CMake
中使用它?
在CMake
中add_custom_command
可以执行post构建命令如strip
。 PROJECT_NAME
变量定义为您的目标二进制文件,例如
# Set the project name
set(PROJECT_NAME "MyProject")
project(${PROJECT_NAME})
将以下代码放在 CMakeLists.txt
的 add_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。