2009-11-30 69 views
3

也许这是一个常见问题。事实上,我想我几年前曾问过它......但我不记得答案。尽管小项目g ++产生大的二进制文件

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

编辑: 当我回应我想要的,我认为这是一个澄清的情况。我想知道的是,为什么这样一个小程序的规模如此之大,以及与静态,共享库和它们的不同之处有什么关系。如果说这是一个太长的故事,可以随意指出文档。谢谢

+0

g ++? (在标题中) – kurast 2009-11-30 12:36:43

+1

@kurast它是C++的gcc编译器 – laura 2009-11-30 12:37:40

+1

@ gotch4 eclipse CDT使用的结构非常类似于makefile;我会谷歌如何使用makefiles动态链接,然后右键单击该项目,选择属性,然后查看“C/C++构建”和“C/C++常规”为相同的选项。 – laura 2009-11-30 12:41:15

回答

2

如果您给g ++动态库名称,并且不通过-static标志,它应该动态链接。

为了减小尺寸,您当然可以使用strip二进制,并将-Os(优化大小)优化标志传递给g++

+0

使用'-s'来'strip'。 – gdw2 2013-10-29 19:32:14

0

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

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

+0

是否有任何数据来支持它始终生成最小二进制文件的声明?在某些情况下,我发现英特尔编译器比MSVC的效果要好得多,因为结果对象大小。 (当然,在几乎*任何意义上,小并不意味着“更好”,因为更好的优化通常需要更多空间) – 2009-11-30 15:36:07

1

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

在回答您的编辑:

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

+0

我没有......我想它是在文件中包括我正在使用的整个STL容器... – gotch4 2009-11-30 12:54:04

1

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

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

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

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

真正的问题是为什么这件事? 800KB仍然很容易安装在软盘上! 这大部分是一次性成本。这并不意味着如果你写了两倍的代码,它将占用1600KB。更可能的是,它需要810KB或类似的东西。

不要担心一次性启动成本。

2

要记住的一件事是即使您正在动态链接C++库,使用STL结果在您的可执行文件中有额外的代码。这是因为STL是一堆模板,直到您编写和编译代码时才会实际编译。由于库无法预测可能存储在容器中的内容,因此库无法为容器的特定用途包含代码。与STL中的算法和其他所有内容一样。

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

0

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

通过编译为RELEASE版本,可以减少编译后的二进制文件的大小,优化为二进制大小。

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

IMO你真的不应该担心,但如果你真的偏执,看看这个:Smallest x86 ELF Hello World

-5

利用Visual C++ 6.0 它支持Windows 95到Windows 7 ,可以编译成x86平台,但只适用于Windows。 所以如果你是一个Windows用户只是坚持使用Windows编译器而不是GCC,这实际上是sux。大多数人说Visual C++是sux因为他们是反微软件。 也记得使用“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

+2

为什么我可以只冷静一次?它并没有回答这个问题,它是漫不经心的,其中的一部分肯定是错误的。 pfff。 – 2010-11-06 21:17:41

+2

我希望stackoverflow有一个“最糟糕的最好”页面。 – Cryo 2011-05-18 19:33:42

相关问题