strip 命令能够去除可执行程序和动态库中的的符号和调试信息,从而达到减小文件的大小的目的。由于 strip 会删除文件中的调试信息,因此,其通常用于发布(Release)版本的程序。
使用 cmake 生成目标文件时,可通过如下几种方式生成对应文件的 strip 版本。
注:文章中使用的源码工程基于这篇文章。并且,在生成 Makefile 时使用 cmake -DCMAKE_BUILD_TYPE=Release … 命令。
1. 借助 cmake install 命令
CMakeLists.txt:
cmake_minimum_required(VERSION 3.12)
project(exe-abs-path C)
set(CMAKE_VERBOSE_MAKEFILE ON)
add_executable(${PROJECT_NAME} main.c)
install(TARGETS ${PROJECT_NAME} DESTINATION bin)
执行 cmake -DCMAKE_INSTALL_PREFIX=…/ …生成 Makefile 以后,执行 make help 命令,可以看到如下信息:
执行 make 和 make install/strip 以后可以在 build/ 和 bin/ 目录下看到 exe-abs-path 可执行程序。使用 file 命令查看文件信息:
file exe-abs-path
2. 使用 add_custom_command()
CMakeLists.txt:
cmake_minimum_required(VERSION 3.12)
project(exe-abs-path C)
set(CMAKE_VERBOSE_MAKEFILE ON)
add_executable(${PROJECT_NAME} main.c)
install(TARGETS ${PROJECT_NAME} DESTINATION bin)
#only in Release type use strip
if(CMAKE_BUILD_TYPE)
if(${CMAKE_BUILD_TYPE} STREQUAL "Release")
add_custom_command(TARGET ${PROJECT_NAME}
POST_BUILD
COMMAND $ENV{STRIP} -s ${PROJECT_NAME}
)
endif()
endif()
add_custom_command() 命令中
E
N
V
S
T
R
I
P
为
s
t
r
i
p
程序(
ENV{STRIP} 为 strip 程序(
ENVSTRIP为strip程序(ENV{var} 用于访问系统变量 var)。
3. 使用 gcc 中的 -s 选项
该方法是利用 GCC 中的 “-s” 选项来去除可执行程序的符号表和重定位信息。
3.1 set_target_properties()
CMakeLists.txt:
cmake_minimum_required(VERSION 3.12)
project(exe-abs-path C)
set(CMAKE_VERBOSE_MAKEFILE ON)
add_executable(${PROJECT_NAME} main.c)
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE "-s")
编译:
文件信息:
3.2 target_link_options()
cmake 从 3.13 版本后才支持该命令。
CMakeLists.txt:
cmake_minimum_required(VERSION 3.12)
project(exe-abs-path C)
set(CMAKE_VERBOSE_MAKEFILE ON)
add_executable(${PROJECT_NAME} main.c)
install(TARGETS ${PROJECT_NAME} DESTINATION bin)
target_link_options(${PROJECT_NAME} PRIVATE $<$<CONFIG:RELEASE>:-s>)
编译:
文件信息:
3.3 set(CMAKE_C_FLAGS_RELEASE “${CMAKE_C_FLAGS} -s”)
CMakeLists.txt:
cmake_minimum_required(VERSION 3.12)
project(exe-abs-path C)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_C_FLAGS_RELEASE "-s")
add_executable(${PROJECT_NAME} main.c)
编译:
文件信息:
4. 总结
strip 命令可大大减少程序的占用空间,软件发布时可使用该命令针对可执行程序和动态度进行处理。上面列出的方法中,推荐使用 3.1 和 3.2。因为这两个命令只会对目标(target)产生影响,并且,只有在 CMAKE_BUILD_TYPE 为 Release 时才会产生作用,即 cmake -DCMAKE_BUILD_TYPE=Release …。