库的大小和可执行文件

gol*_*ean 10 static-libraries static-linking

我在Windows上使用MSVC创建了一个静态库*.lib.图书馆的大小是70KB.然后我有一个链接这个库的应用程序.但是现在最终可执行文件(*.exe)的大小是29KB,小于库.我想知道的是:

  1. 由于库是静态链接的,我认为它应该直接添加到可执行文件大小,最终的exe大小应该大于那个?Windows exe格式是否也对二进制数据进行了一些压缩?

  2. 它是如何用于linux系统的,那就是linux上的库(*.a/*.la文件)的大小与linux可执行文件(*.out)的大小有什么关系?

-广告

Dav*_*man 12

Windows和Unix上的静态库是.obj/.o文件的集合.链接器查看每个目标文件,并确定程序是否需要链接.如果不需要,则目标文件不会包含在最终的可执行文件中.这可能会导致可执行文件比库小.

编辑:正如MSalters所指出的,在Windows上,VC++编译器现在支持生成启用功能级链接的目标文件,例如,请参见此处.事实上,编辑和继续需要这样,因为编辑和继续需要能够替换可执行文件的最小可能部分.


Ada*_*eld 5

静态库可能包含几个从未使用过的函数。当链接器将库与主可执行文件链接时,它发现某些函数从未被使用(并且它们的地址从未被获取并存储在函数指针中),它只是丢弃代码。它还可以递归执行此操作:如果从未调用函数 A(),并且 A() 调用 B(),但从未以其他方式调用 B(),则它可以删除 A() 和 B() 的代码。在 Linux 上,同样的事情也会发生。


Gre*_*ill 5

文件中还有其他簿记信息,这些信息.lib是最终可执行文件不需要的.此信息有助于链接器找到实际链接的代码.此外,调试信息可能存储在.lib文件中但不存储在.exe文件中(我不记得在lib文件中为obj存储调试信息的位置,它可能在其他地方).