【cmake】make install/strip:减小目标占用的空间大小

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 命令,可以看到如下信息:
【cmake】make install/strip:减小目标占用的空间大小_第1张图片
执行 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 $<$:-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 …。
————————————————

原文链接:https://blog.csdn.net/weixin_43717839/article/details/128904240

你可能感兴趣的:(嵌入式基础,Linux常识,c++,开发语言)