在我今天下载了预建的 boost 库之前,我从来没有考虑过静态库和动态库之间的大小差异。我发现 boost 的静态库比动态库大得多。
例如,调试多线程boost wave静态库是97.7 mb
大小,而同一个库,但动态的,只是1.4 mb
大小(包括导入库和dll)!这是一个巨大的差异。这是为什么?
第二个问题,如果我静态链接到wave
图书馆。这是否意味着我的可执行文件的大小会膨胀到超过97.7 mb
?
在我今天下载了预建的 boost 库之前,我从来没有考虑过静态库和动态库之间的大小差异。我发现 boost 的静态库比动态库大得多。
例如,调试多线程boost wave静态库是97.7 mb
大小,而同一个库,但动态的,只是1.4 mb
大小(包括导入库和dll)!这是一个巨大的差异。这是为什么?
第二个问题,如果我静态链接到wave
图书馆。这是否意味着我的可执行文件的大小会膨胀到超过97.7 mb
?
静态库中包含完整的调试符号信息。对于 DLL,该信息将位于 .pdb 文件中(我假设其大小与静态库相似)。
当您链接到静态库时,符号信息不会被复制到 .exe 中 - 它将被放置在 .pdb 文件中(如果您的构建配置为创建 .pdb 文件)。.pdb 文件不需要与 .exe 一起分发,无论是否创建 .pdb。
在我从 boostpro.com 获得的预建库下载中,我没有获得它们提供的 boost DLL 的 .pdb 文件。如果您自己构建 DLL,您可能会获得 .pdb 文件(尽管您可能需要设置一些配置选项,我不知道详细信息是什么)。
更新:
看起来我对于轻松获取 boost 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
不,仅仅因为 LIB 文件有一定的大小,并不意味着它会将该大小添加到您的 EXE 中。事实上,大多数链接器都足够聪明,可以只链接使用的东西。将其与必须包含所有内容的动态库进行比较。
静态库肯定会让你的 EXE 更大,但我总是更喜欢它。然后我不必担心在运行时丢失或不兼容的库。(或者至少,我尽量减少这种可能性。)
由于静态库不包含完成的二进制数据,而是链接器构建二进制文件所需的信息,因此这些信息可能比构建的二进制文件大。
当头文件中定义的某些函数在 cpp 文件中使用时,编译器将其代码(内联或简单地添加)到生成的目标文件中。这意味着会有很多重复。合并它们是链接器的工作,所以静态库只是等待链接器被减少:)
通常,静态库的可执行文件大小通常较大,而动态库的可执行文件大小通常较小。DLL 和 EXE 是分开链接的,所以链接器无法知道 DLL 中需要哪些功能,哪些可以丢弃。在静态库的情况下,链接器具有此类信息,并且只能获取那些使用的 obj 文件。
调试静态库包含调试信息,这解释了巨大的大小差异。