在实际的项目里面,产品中除去系统加载使用的空间外,留给具体的功能应用程序的空间较小,因此需要对应用程序用到的库进行裁剪。比如在实际的项目中,应用程序和库一共14M,最后进行裁剪,减少了6-7M

对于空间有限,使用的库较多(依赖的第三方开源库openssl等)占用体积较大,我们如果使用动态库(.so)显然不适合,因此我们可以使用静态库(.a),但是这样还不够,依赖的库中有很多实现的函数,但是应用程序并没有使用,没用的函数就应该不链接进来,占用宝贵的空间。

对此就需要修改编译选项:

(1)编译时加入:-ffunction-sections, -fdata-sections 选项,这样编译的时候,把每个函数作为一个section,每个数据(应该是指全局变量之类的吧)也作为一个section。如果不加-ffunction-sections选项,则默认似乎是每个源文件为一个section进行链接,这样子只要这个文件中用到了一个函数,那么所有的函数都会被链接进来。

(2)链接时加入:--gc-sections选项 ,这样链接的时候,--gc-sections会把没用到的section丢弃掉,最终的可执行文件就只包含用到了的函数和数据。链接的单位,是函数级别,这样就能丢弃没使用的函数。

当我们依赖静态库,编译和链接选项加如上所示后,应用程序变小,但是查看符号表等,发现一些库中的函数依然存在,于是经过一些时间的排查,当添加上-fvisibility=hidden

在linux下,源文件中的所有函数都有一个默认的visibility属性为public,在编译命令中加入-fvisibility=hidden参数,会将所有默认的public的属性变为hidden。此时,如果对函数设置__attribute__ ((visibility("default")))参数,使特定的函数仍然按默认的public属性处理,则-fvisibility=hidden参数不会对该函数起作用。所以,设置了-fvisibility=hidden参数之后,只有设置了__attribute__ ((visibility("default")))的函数才是对外可见的,如此则效果等同于Visual Studio下的__declspec(dllexport)定义。

综上:

修改了CMakeLists.txt:
ADD_DEFINITIONS("-Wall")
ADD_DEFINITIONS("-fPIC")
ADD_DEFINITIONS("-Wl,-Bsymbolic -lm")
ADD_DEFINITIONS("-std=c++11")
SET(CMAKE_CXX_FLAGS "-Wall -fPIC -s -fvisibility=hidden -ffunction-sections -fdata-sections -Wl,-rpath-link=$(../../../Library/ISVP_T20Z/lib) -Wl,-Bsymbolic -lm -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -DISVP")

使用-section等参数实现对库的裁剪,从而减小程序体积相关推荐

  1. FORCAL参数优化动态库FcOpt

    欢迎访问 Forcal程序设计 FORCAL参数优化动态库FcOpt V1.0 目 录 1 什么是FcOpt 2 Forcal参数优化函数 fcopt::Opt 求无约束条件下的n维极小值 优化能力一 ...

  2. python命令行大全-用什么库写 Python 命令行程序(示例代码详解)

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...

  3. c语言程序阅读题库,C语言程序设计-阅读程序题库及答案.doc-资源下载在线文库www.lddoc.cn...

    C语言程序设计-------阅读程序题库及答案.doc 阅读程序题 2 1 以下程序的输出结果是 main D float a a 1 100000000 printf g a A 0 00000e ...

  4. 题库明细 使用java理解程序逻辑

    题库明细 使用java理解程序逻辑 初识java 变量.数据类型和运算符 选择结构(一) 选择结构(二) 循环结构(一) 循环结构(二) 数组 循环结构进阶 类和对象 类的无参方法 带参数的方法 字符 ...

  5. python 代码命令大全-用什么库写 Python 命令行程序(示例代码详解)

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...

  6. c调用python第三方库_c/c++调用python程序且含tensorflow第三方库

    对于纯python程序而言,用c程序来调用是比较适合的,如果python程序中包含了其他第三方库,则调用极可能出错,且不易查明原因.如笔者曾用c程序调用包含tensorflow的python程序,有的 ...

  7. python-基于yagmail库开发自动邮件发送程序

    目录: 前言: 一,准备工作; 1.安装第三方库 2.邮箱设置步骤 二,编写程序 1.发送单个邮件的程序 2.发送单个邮件的进阶程序 前言: 很多时候,我们发送网络邮件都需要进入邮箱网站或App,可能 ...

  8. 用寄存器HAL库完成LED流水灯程序

    重庆交通大学信息科学与工程学院 <嵌入式系统开发>课程 作业报告(第4周) 班 级: 通信工程2001 姓名-学号 : 阎桂董-632007030622 实验项目名称: 作业题目 实验项目 ...

  9. ACMNO.30 C语言-宏交换 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。

    题目描述 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参.输出已交换后的两个值. 输入 两个数,空格隔开 输出 交换后的两个数,空格隔开 样例输入 1 2 样例输出 2 ...

最新文章

  1. Python学习笔记.OS学习笔记 OS操作系统(operating system)(二)程序和进程 输出进程号,工作目录最有用!
  2. eclipse工程设置项目jre
  3. 【原创】概率DP总结 by kuangbin
  4. 敏捷大观园 - 视频分享第6弹!
  5. 操作系统上机题目(多进程1)
  6. 102_Power Pivot DAX 排名后加上总排名数
  7. OpenCV3学习(4.1)——图像阈值操作(Threshold,AdaptiveThreshold)
  8. 计算机技术应用于教学案例,中职计算机教学中案例教学方法的运用
  9. javascript原型和原型链
  10. 产品经理如何搭建自己的知识地图?
  11. H5点击复制到剪贴板
  12. php curl 模拟微信公众号登入
  13. 5、优化方法:随机梯度下降法
  14. Easy Iot实现MQTT实验
  15. 计算机是通过电网进行传播,2016年9月计算机一级MS Office考前必做试题及答案(4)...
  16. SIM900A(GSM模块)学习
  17. Java 密码学相关知识
  18. springboot水产品销售系统的设计与实现毕业设计源码041700
  19. 【模型复现】零样本预测文本分类模型——ESM 快速复现模型
  20. Matlab产生正交矩阵

热门文章

  1. 一条Sql的执行过程
  2. c语言乞丐的图片,乞丐简笔画图片
  3. Java小白到到大佬路线
  4. 计算机系统如何恢复出厂设置路由器,路由器恢复出厂设置的具体操作步骤-电脑自学网...
  5. 终于有大佬把“计算机底层原理“全部总结出来了
  6. Linux系统 ISO下载
  7. Excel宏(VBA)类模块的创建与调用
  8. 部署XPE镜像文件到虚拟机
  9. Python 爬金十数据
  10. Streptavidin-MAL,Maleimide 马来酰亚胺修饰/标记/偶联链霉亲和素