在我今天下载预先构建的boost库之前,我从未考虑过静态库和动态库之间的大小差异。我发现boost的静态库远远大于动态库。
例如,调试多线程增强波静态库的大小为97.7 mb
,而相同的库(但是动态的)大小仅为1.4 mb
(包括导入库和dll)!这是一个巨大的差异。 为什么?
第二个问题,如果我静态链接,比如说wave
库。这是否意味着我的可执行文件的大小会超过97.7 mb
?
答案 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)
调试静态库包含调试信息,这解释了巨大的差异。