68336016 发表于 2018-9-14 09:01:31

请教下文件编译的知识,如何减小目标文件(obj, o)的体积大小

本帖最后由 68336016 于 2018-9-14 09:04 编辑

我要编译一些库给ARM和MIPS使用,因为这些ARM和MIPS自带完整的SDK,我的库的源码可以放进SDK一起编译。

这样带来一个问题,编译出来的目标文件( obj, o)很大,打包成的库文件也非常大。

而我自己将库源码独立出来建个工程,依然还是用SDK指定的工具链来编译,这样编译出来的目标文件体积就很小,只有上面操作的1/3都不到。

当然2种方法编译出来的库都正常使用的,但是自己独立编译的库,因为各种编译参数不一定能跟SDK保持一致,所以担心有潜在隐患。

但是在SDK里一起编译出来的文件,为什么体积会那么大呢?

用ultraedit查看目标文件,发现里面非常多关于芯片,编译器的字符信息,这些对程序实际运行肯定都是没用的。

这些无用信息是否可以在编译时候去除掉呢?不然显得文件太庞大了。

不知道最终链接进可执行文件后,会不会影响最后程序体积,但是非常影响客户看法,总觉得你的文件太占空间了。

wye11083 发表于 2018-9-14 10:28:59

gcc有选项可以关掉所有信息输出。忘了。。

abutter 发表于 2018-9-14 11:17:38

你说的“独立出来“是指生成 lib,是生成 archive 类型,还是互相链接,生成 .o 类型

68336016 发表于 2018-9-14 11:20:22

abutter 发表于 2018-9-14 11:17
你说的“独立出来“是指生成 lib,是生成 archive 类型,还是互相链接,生成 .o 类型 ...

就是自己单独建个工程,只编译自己库的文件。生成obj,然后ar之类命令打包成.lib或者.a

muniao 发表于 2018-9-14 11:36:38

不用的函数全部加static

vuo50z 发表于 2018-9-14 11:43:49

同一个C文件,用同样的编译器和编译选项,不管在哪里,编出来的目标文件肯定是一样的。你在SDK里编出来的目标文件估计是加了调试信息的,gcc的话好像是-g选项打开了。

abutter 发表于 2018-9-17 10:31:04

提供给别人库,可以直接生成 obj 文件,然后打包成 .a,好处是容易使用,只是省了别人的编译时间,坏处是你每个文件的对外函数或者变量会被透除去。另外一种做法是半链接一次,生成一个 .o,不对外的接口函数和变量可以从文件种剔除,这样更容易优化,接口更明晰。
页: [1]
查看完整版本: 请教下文件编译的知识,如何减小目标文件(obj, o)的体积大小