连接自产静态库和工程自包含实现的PEsize比较.

来源:互联网 发布:可编程显示器软件 编辑:程序博客网 时间:2024/05/01 23:45

最近的工作任务不允许使用dll,  为了复用代码, 使用了静态库, 将UI层之外的逻辑层和基础函数层都封装成静态库.

昨天下午,改完程序,功能性部分完成。领导说:程序体积太大了,要减肥。

因为另外一个同事写的类似工程才不到1MB.


推测: 因为包含的静态库中包含了太多不用的函数。

因为时间比较紧急,情急之下,直接将那个工程包含的静态库的依赖关系清掉.

一边编译,一边将需要的函数直接编到本工程下面

简单的列了一个文件functionA.*(.h, .cpp), functionB.*(.h, .cpp) ..., 用了将近2个小时将工程编译过。

因为工程的编译设置并没有改,编译后,可以看到工程减肥了200K.


将工程设置切到release版, 采用 Maximize Speed (/O2),   不产生调试信息, PE size只有700K了. 搞定.


心里还有一点小疑问,采用静态库,开始必然是为某个工程准备的。其他工程使用时,总有用不到的函数。

会不会不同的程序使用静态库,都产生肥胖的效果呢?


正好这几天发现基础函数层,有业务逻辑的部分需要重构,拆出来,使基础函数层能被别的工程单独使用。

拆好后,验证了这个问题。

* 同样的工程(就是昨天下午改的那个字包含实现,减肥的那个), 这回还是连接逻辑层+基础函数层。

  编译设置还是采用 /O2 + 不产生调试信息,编译完之后是 699K。 比手工字包含的还要小...

* 单独写一个测试程序,挂上同样的逻辑层+基础函数层, 随便调用了静态库中的1,2个函数, 采用了 /O2 + 不产生调试信息, 编译出来90K, 


通过试验可以发现,Release版优化后,不会产生用不到的函数产生的PE size肥大问题.

在不允许使用DLL的情况下,多个工程使用相同的静态库,工程便于维护.


以前没注意过静态库和程序字包含实现的区别, 导致昨天浪费了2小时~.




0 0
原创粉丝点击