Code :: Blocks + MinGW:最小化静态库的大小

时间:2014-08-30 12:09:48

标签: c mingw static-libraries codeblocks

我已尝试将-ffunction-sections -fdata-sections传递给编译器,但这似乎没有达到预期的效果。据我所知,我还必须将-Wl,--gc-sections传递给链接器,但此时我还没有链接文件。我只想让.a库文件尽可能小,冗余代码/数据最少。

3 个答案:

答案 0 :(得分:2)

编译器根据程序的知识执行优化。优化级别-O2及以上,特别是启用一次一个单元模式,这允许编译器在编译函数时考虑从文件中的后续函数获得的信息。一次一个地编译多个文件到单个输出文件允许编译器在编译每个文件时使用从所有文件中获取的信息。

并非所有优化都由标志直接控制。

-ffunction截面 -fdata截面     如果目标支持任意节,则将每个函数或数据项放入输出文件中的自己的部分。函数的名称或数据项的名称决定了输出文件中节的名称。

Use these options on systems where the linker can perform optimizations to improve locality of reference in the instruction space. Most systems using the ELF object format and SPARC processors running Solaris 2 have linkers with such optimizations. AIX may have these optimizations in the future.

Only use these options when there are significant benefits from doing so. When you specify these options, the assembler and linker will create larger object and executable files and will also be slower. You will not be able to use gprof on all systems if you specify this option and you may have problems with debugging if you specify both this option and -g. 

你可以使用以下链接了解更多详情.. :-) http://gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/Optimize-Options.html

答案 1 :(得分:1)

以下将减少编译对象(以及静态库)的大小

-Os -g0 -fvisibility=hidden -fomit-frame-pointer -mno-accumulate-outgoing-args -finline-small-functions -fno-unwind-tables -fno-asynchronous-unwind-tables -s

以下将增加对象的大小(尽管它们可能使二进制文件更小)

-ffunction-sections -fdata-sections -flto -g -g1 -g2 -g3

真正使静态库更小的唯一方法是通过使用-ffunction-sections -fdata-sections编译静态库并将最终产品与-Wl,--gc-sections,--print-gc-sections链接来删除不需要的代码,以找出哪些部分是残留的。然后返回并删除这些函数/变量(这也适用于制作较小的共享库 - 请参阅http://libraryopt.sf.net

答案 2 :(得分:0)

如果编译器标志中有-g,那么比较库的大小,而不是它。如果它包含调试信息,我可以很容易地想象你将静态库的大小加倍。如果这是你所看到的,你可能已经剥离了调试符号库,因此不能显着缩小库文件。这可以解释你在某些时候将尺寸缩小一半的记忆。