在编译时删除不必要的代码

时间:2011-08-25 14:20:43

标签: c++ gcc

我使用CImg库为我创建的图像编辑软件编写插件。 问题是当我包含CImg时,插件的大小从200kb爆炸到2Mb! 但在这种特殊情况下,我只使用5%的CImg代码!

所以我的问题是:有没有办法在编译时删除不必要的代码,所以最终的可执行文件不会膨胀?

(我使用Qt 4.8.0和最新的CImg,Qt Creator和MacOS Lion)。

编译/链接标志: QMAKE_CXXFLAGS + = -Os -fdata-sections -ffunction-sections LIBS + = -Wl --gc-sections

3 个答案:

答案 0 :(得分:2)

确保使用完全优化(或仅-Os进行大小优化)并使用strip -s剥离调试符号进行编译。这可能会占用很多空间。

同样可能的是,当只使用5%的CImg代码时,你使用的5%是在内部使用其他95%。您可以做的最好的事情就是优化和去除调试符号。

答案 1 :(得分:1)

根据gcc documentation,当-flto选项与-fuse-linker-plugin或-fwhole-program选项结合使用时,gcc可以通过dead code elimination删除未使用的非静态函数。

Clang supports link time optimization,可以删除链接文件中未使用的非静态函数。

答案 2 :(得分:0)

第一个也是最明显的:你有没有删除调试信息?尝试命令

strip -s <program>

此外,使用-Os进行编译可能会有所帮助。