静态和动态(调试)库之间的大小差异以及对最终exe的影响

问题描述:

我从来没有考虑过静态库和动态库之间的大小差异,直到我今天下载了预建的boost库。我发现boost的静态库比动态库要大得多。静态和动态(调试)库之间的大小差异以及对最终exe的影响

例如,调试多线程助推波静态库的大小为97.7 mb,而同一个库(但是动态的)的大小仅为1.4 mb(包括导入库和dll)!这是一个巨大的差异。 这是为什么?

第二个问题,如果我静态链接,比如说,wave库。这是否意味着我的可执行文件的大小会超过97.7 mb

静态库在其中包含完整的调试符号信息。对于信息将在.pdb文件中的DLL(我认为它的大小与静态库相似)。

当你链接到静态库,符号信息不会被复制到.exe文件 - 它将被放置在.pdb文件(如果您的构建被配置为创建一个.pdb文件)。无论是否创建.pdb,.pdb文件都不需要与.exe一起分发。

在预建库下载我从boostpro.com得到的,我没有得到.pdb文件为他们提供升压的DLL。如果你自己构建DLL,你可能会得到.pdb文件(尽管你可能需要设置一些配置选项,我不知道细节是什么)。


更新:

看起来我可能是错的容易获得的.pdb文件进行升压的DLL。从http://comments.gmane.org/gmane.comp.lib.boost.build/23246

> Is there an additional option that I can pass on the command line to 
> have the (correctly generated) PDB files also copied into the stage 
> directory? 

不是在这个时候。你只能砍 tools/build/v2/tools/package.jam到 添加<install-type>PDB无处不在哪里 <install-type>SHARED_LIB<install-type>STATIC_LIB现在 写的。

+2

这是非常有趣的...他们是否编译发布静态库与调试信息?这不会允许整个程序优化,从而慢的代码(或我在这里错了)? – Samaursa 2011-01-06 08:40:27

不,只是因为LIB文件具有一定的大小,并不意味着它会将该大小添加到您的EXE中。事实上,大多数链接器都足够聪明,只需链接所用的东西。将其与动态库相比较,该库必须包含所有内容。

静态库绝对会让你的EXE变大,但我总是更喜欢它。然后,我不必担心在运行时丢失或不兼容的库。 (或者至少,我将这种可能性降至最低。)

调试静态库包含调试信息,它解释了巨大的尺寸差异。

由于静态库不包含完成的二进制数据,而是链接器构建二进制文件所需的信息,因此此信息可能比构建的二进制文件大。

当在cpp-file中使用头文件中定义的某些函数时,编译器将其代码(内联或简单添加)放到生成的目标文件中。这意味着会有很多重复。这是连接器的工作合并它们,所以静态库只是等待连接,以减少:)

一般可执行文件的大小通常与静态库大,但可执行文件的动态库一起的大小通常较小。 DLL和EXE分开链接,因此链接器无法知道DLL中需要哪些功能以及哪些功能可以被丢弃。在静态库的情况下,链接器具有这样的信息并且可以仅采用那些使用的obj文件。