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

时间:2011-01-06 07:34:52

标签: boost static-libraries static-linking dynamic-linking dynamic-library

在我今天下载预先构建的boost库之前,我从未考虑过静态库和动态库之间的大小差异。我发现boost的静态库远远大于动态库。

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

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

4 个答案:

答案 0 :(得分:4)

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

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

在我从boostpro.com获得的预构建库下载中,我没有获得它们提供的boost DLL的.pdb文件。如果你自己构建DLL,你可能会得到.pdb文件(虽然你可能需要设置一些配置选项,我不知道具体是什么)。


更新:

看起来我可能错误地获取了增强DLL的.pdb文件。来自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   写入。

答案 1 :(得分:3)

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

静态库肯定会让你的EXE更大,但我总是喜欢它。然后我不必担心在运行时丢失或不兼容的库。 (或者至少,我最大限度地减少了这种可能性。)

答案 2 :(得分:1)

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

当在cpp文件中使用头文件中定义的某些函数时,编译器将其代码(内联或简单地添加)放到结果对象文件中。这意味着会有很多重复。它是链接器合并它们的工作,因此静态库只是等待链接器被减少:)

通常,可执行文件的大小通常比静态库大,但可执行文件的大小和动态库通常较小。 DLL和EXE是分开链接的,因此链接器无法知道DLL中需要哪些功能以及哪些功能可以被抛出。在静态库的情况下,链接器具有此类信息,并且只能使用那些使用的obj文件。

答案 3 :(得分:0)

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