c ++静态库太大了,为什么?

时间:2010-06-24 08:44:27

标签: c++

这就是我正在做的事情(这是一个例子,而不是现实生活中的语法):

$ svn co http://svn.boost.org/svn/boost/trunk/libs/regex/src regex
$ c++ -o regex/*.obj -c regex/*.cpp

我在*.obj中有17个regex个文件。现在我正在尝试从它们创建一个静态库:

$ ar -r regex.lib regex/*.obj

库的大小 10Mb 。它的尺寸是否合适?只有17个C ++文件,它应该是那么大吗?我有一个填充,这个库包含重复的符号。他们中的许多人......提前感谢您的一些暗示。

3 个答案:

答案 0 :(得分:8)

是的,静态库往往很大。

原因是它们必须包含源文件中的所有内容。最终的可执行文件可以删除它不需要的所有符号,但是在静态库中,你还不知道将需要哪些符号,因此所有内容都必须打包在那里,通常还有很多调试信息。

这个尺寸并没有像我那样与众不同。当然,当您将其链接到可执行文件时,可执行文件将不会增长那么多。

答案 1 :(得分:5)

构成对象文件的大小总和是多少?这几乎就是聚合档案的预期大小。 ar添加的元数据应该是最小的。

使用nm实用程序检查存档以查看其包含的对象文件和符号。 nm --size-sort开关可以快速找出存档中占用最大空间的内容。

答案 2 :(得分:2)

您无法根据源文件的数量预测输出的大小。一个文件可能包含十几行简单代码,或数千行意大利面,或一个庞大的数据表。对象文件(和静态库,它们只是目标文件的集合)包含用于链接的元数据,可以从最终的可执行文件中删除。如果编译器配置为生成它,它们也可能包含大量调试信息。你正在构建没有优化,这通常会使代码膨胀很多。内联函数将出现在使用它们的每个目标文件中;链接将解决这些重复项,但只是将对象与ar结合在一起不会。

我刚做了同样的实验:我开始使用3.5Mb而不是10Mb;添加调试信息(-g)将其增加到8Mb;启用优化(-O3)将其减少到1.6Mb,与我计算机上安装的版本大小相同。我的计算机上安装的动态库(使用链接器而不是ar生成)仍然较小,大约为666kb。

但是你为什么担心图书馆的大小?您是否计划将产品分发为预编译的静态库?在软盘上?你想在Amiga 500上发展吗?如果您正在开发有限平台,那么请担心最终可执行文件的大小和运行时占用空间。