尽管项目很小,但是g ++会生成大二进制文件

时间:2009-11-30 12:35:10

标签: c++ g++ shared-libraries eclipse-cdt

这可能是个常见问题。事实上,我想我多年前问过它......但我记不起答案了。

问题是:我有一个由6个源文件组成的项目。所有这些都不超过200行代码。它使用许多STL容器,stdlib.h和iostream。现在可执行文件大小约为800kb ....我想我不应该静态链接库。如何使用GCC?在Eclipse CDT中?

编辑: 当我回答我的想法时,我认为是澄清的情况。我想知道的是为什么这么小的程序规模如此之大,与静态,共享库及其区别的关系是什么。如果这是一个太长的故事,告诉你随时指出文档。谢谢

7 个答案:

答案 0 :(得分:2)

如果您提供g ++动态库名称,并且未传递-static标志,则应该动态链接。

要缩小尺寸,您当然可以strip二进制文件,并将-Os(针对尺寸进行优化)优化标记传递给g++

答案 1 :(得分:2)

要记住的一件事是,即使您正在动态链接C ++库,使用STL也会在可执行文件中生成额外的代码。这是因为STL是一堆 templates ,在您编写和编译代码之前,它们实际上并未编译。由于库无法预测您可能存储在容器中的内容,因此库无法包含该容器特定用法的代码。算法和STL中的其他所有内容也是如此。

我不是说这绝对是你的可执行文件比你预期的要大得多的原因。但这可能是一个因素。

答案 2 :(得分:1)

除非您在makefile中的链接器上设置静态标志,否则Eclipse应默认动态链接。

回应你的编辑:

- 当您静态链接时,可执行文件包含您链接到的每个库的完整副本 - 当你动态链接时,可执行文件只包含对链接库的引用和挂钩,这是一个非常少量的代码。

答案 3 :(得分:1)

可执行文件必须包含的不仅仅是代码。

至少,它包含一些启动代码,在程序启动之前设置环境并在必要时加载任何外部库。

如果您已静态链接运行时库,则还可以将其包含在可执行文件中。否则,您只会获得一个小的存根,大小足以将系统调用重定向到外部运行时。

根据编译器设置,它可能还包含大量调试信息和其他非必要数据。如果启用了优化,则可能会增加代码大小。

真正的问题是为什么这件事? 800KB仍可轻松放在软盘上! 其中大部分是一次性费用。这并不意味着如果你写两倍的代码,它将占用1600KB。更有可能的是,它需要810KB或类似的东西。

不要担心一次性启动费用。

答案 4 :(得分:0)

使用-O3和-s标志生成最优化的二进制文件。另请参阅此link以获取更多信息。

如果您要为Windows构建,请考虑使用Microsoft编译器。它总是在该平台上生成最小的二进制文件。

答案 5 :(得分:0)

大小通常会导致静态库链接到您的应用程序中。

您可以通过编译为RELEASE版本来减小已编译二进制文件的大小,并优化为二进制大小。

可执行文件大小的另一个来源是库。你说你不使用外部库,除了STD,所以我相信你将C Runtime包含在你的可执行文件中,即静态链接。所以检查动态链接。

IMO你不应该真的为此担心,但如果你真的很偏执,请查看:Smallest x86 ELF Hello World

答案 6 :(得分:-5)

使用Visual C ++ 6.0 它支持Windows 95到Windows 7。 并且可以编译为x86平台,但仅适用于Windows。 因此,如果您是Windows用户,请坚持使用除GCC之外的Windows编译器,这实际上是sux。大多数人认为Visual C ++是sux,因为他们是Anti-Microsofters。 还记得使用“Visual C ++ 6.0”,如果你使用较新的,可能你无法在Windows 95上运行你的文件。我已经测试了所有这些事情,这就是我说的原因。 GCC生产最大的二进制文件,但Visual C ++不是,英特尔编译器可以用来节省超过30%的空间,但它需要英特尔处理器,除非性能太可怕。 你需要记住的另一件事是当你使用模板,虽然你看到小线条 当你编译时,这些函数会被扩展,因此结果会产生更大的二进制文件。 如果你需要更小的二进制文件我建议转移到C因为C实际上是广泛使用但不是OO infact C比C ++易于使用 这比C ++示例

更有意义

cout<< “Hello World”<< ENDL; printf(“%s”,“Hello World”);

第二个说打印字段%s意味着你键入一个字符串,这很容易。 :P