【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 命令,可以看到如下信息:
在这里插入图片描述
执行 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 程序( ENVSTRIPstrip程序(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 …。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值