当我们使用静态库而不是共享库时,为什么exe文件的大小更大

时间:2011-07-12 10:56:50

标签: gcc shared-libraries static-libraries

我对共享库和静态库有一些疑问。让我告诉你我做了什么,我创建了一个静态库,并使用gcc命令创建了一个共享库,libarith.a的大小是6KB和大小libarith.so是18KB。这两个库包含相同的函数。

我在make.c文件中使用了一个简单的函数(比如add(a,b))并使用这些gcc命令链接静态库,

           gcc -L/cygdrive/c/cpros make.c -larith.a # used a static library

exe文件的大小为16.1 KB。

接下来我在make.c文件中使用了相同的函数(相同的add(a,b)),但这些时候使用的是共享库。

          gcc make.c /cygdrive/c/cpros/libarith.so #used a shared library

不幸的是,exe文件的大小是12.1 KB。我好奇怎么样?因为libarith.so的大小是18 KB,而libarith.a只有6 KB。但最后使用共享库生成的exe文件与静态库相比较少。

有人能给我一个很好的理由吗?如果共享库占用的内存较少,那么为什么我们不能一直使用共享库。请告诉我们何时使用共享库以及何时使用静态库。

是的,当我使用-fPIC创建共享库时,它给了我一个警告位置独立代码。这个警告实际意味着什么?

2 个答案:

答案 0 :(得分:1)

共享库中有很多重定位代码,这就是它比静态库大的原因。

使用静态库编译可执行文件时,静态库包含在可执行文件中。使用共享库编译可执行文件时,

有很多原因可以选择静态覆盖共享库,反之亦然。如果您正在为嵌入式平台编写代码,则选择静态。如果您的库被许多其他应用程序使用并且您想要升级它而无需重新编译(在合理范围内)所有应用程序,那么您将选择共享。

你也混淆了两个词。记忆!=存储。在磁盘上,共享库可能更大,但安装后您将只有一个副本。另一方面,使用静态库编译的每个可执行文件都将包含其中静态库的副本。

答案 1 :(得分:0)

使用共享库时,库函数的代码不会插入到二进制文件中。因此,二进制文件更小。缺点是您可能会遇到应用程序与它们正在使用的库之间版本不匹配的问题(又名DLL Hell),因为耦合相当松散。