我从来没有把过多考虑到静态库和动态库之间的大小差异,直到我下载预建今天升压库。我发现,升压的静态库比动态库多大得多。

例如,调试多线程升压波静态库是97.7 mb在尺寸,同时同一个库,而是动态的,仅在尺寸1.4 mb(包括导入库和dll)!这是一个巨大的差异。的这是为什么吗

第二个问题,如果我对静态链接,让我们说,在wave库。这是否意味着我的可执行文件将在规模膨胀到超过97.7 mb更多?

有帮助吗?

解决方案

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

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

在预建库下载我从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现   写入。

其他提示

没有,只是因为LIB文件是具有一定规模,并不意味着它会将该尺寸添加到您的EXE。事实上,大部分的接头是足够聪明的链接中只有东西,这使用。与此相比,动态库,它必须包含一切。

静态库绝对能让你的EXE较大,但我总是喜欢它。然后,我没有失踪或在运行时不兼容的库担心。 (或者至少,我最小化的这种可能性。)

由于静态库不包含成品二进制数据,而是信息所需要的链接程序生成二进制,该信息可以比构建的二进制大。

当在头文件中定义的一些功能在CPP-文件时,编译器把它的代码(无论是内联,或简单地增加),以生成的目标文件。这意味着,会有很多重复的。它的连接器的工作合并它们,所以静态库只是等待,以减少连接器:)

通常可执行的大小通常与静态库更大,但与动态库的可执行一起的尺寸通常是较小的。 DLL和EXE单独联系,所以链接器无法知道哪些功能是需要的DLL和可抛出。在静态库的情况下,连接体具有这样的信息,可以采取仅用于那些OBJ-文件。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top