2011-06-24 175 views
0

谁能给我解释一下什么是GCC中的共享和静态库之间的差异(生成文件)共享和静态库

,我读了静态库是独立的代码,但它会增加你的exectuable文件的大小

但共享库它动态链接的功能,它不会增加您的可执行文件的大小

我不明白这两者之间的区别。

任何人都可以告诉我什么时候应该创建一个静态库,什么时候我应该创建一个共享库。

他们说,共享库是依赖于位置的代码

什么我们所说的与位置相关的代码?

如果共享库不增加代码,并且静态库增加了代码大小 那么我们可以直接使用共享库。

但是为什么我们也有静态库呢?它的真正用处是什么。

请帮我家伙

+1

动态库作为独立的文件必须存在沿着可执行系统上,而只有在编译时需要静态库存在。使用静态库的主要原因之一是避免在系统中存在多个版本的库时发生冲突,并且可能与链接到可执行文件的版本冲突。 – SirDarius

+0

(从标签和标题中删除“makefile”,因为这与makefile无关。) – Beta

+0

共享库始终具有与位置无关的代码。静态库可以有独立的或独立的。 – 2011-06-24 21:53:22

回答

2

当您使用gcc编译代码时,它可以直接生成目标文件,并且可以将多个目标文件链接在一起以生成可执行文件。

静态库只是一个目标文件(通常带有索引)的集合,它可以在创建可执行文件时由链接器使用。

将目标文件链接在一起并链接到一个静态库的区别在于,对于该库,链接器只会从其中选择绝对需要的目标文件,而链接目标文件时链接器将被强制拿走所有的文件。

动态库又不同 - 非常不同。它是一个目标文件的集合,但是这次它的所有内部链接的链接过程的输出已经解决了。

链接动态库意味着链接程序只解析最终可执行文件中的符号,但链接时不添加库中的目标代码。

运行与动态库链接的可执行意味着在运行时一些特殊的软件,有权要求操作系统到指定的动态库加载到内存中(这就是为什么一个动态库必须通过接头创建)通常在节目到达main()之前。

这个可执行文件可以是磁盘上的一个非常小的文件,但是当加载到内存中,并加载动态库的总内存图像库的整体将在已加载可能相当大了。

我相信它的情况下,如果几个不同的程序需要相同的动态库,操作系统可以为每个程序使用虚拟内存来加载库,但这只使用一个物理内存副本 - 这在某些情况下可以节省很多。

如果您发布需要动态库的可执行文件,那么您可能很幸运,该文件可能已经在用户的机器上。如果没有,你也必须安装它。但是,如果您在库中发现错误,那么只需发送新版本的动态库即可修复这些错误。

用静态库构建的可执行文件已准备就绪,但修复错误将涉及重新传输整个可执行文件。

总结:

 
       object files static library dynamic library 
produced by compiler  librarian  linker 
exe   large   smaller   smallest 
ram x 1 copy large   smaller   largest 
ram x n copies large   smaller   smallest 
dep on files independent independent  dependant 
upgrade lib no   no    yes 
+0

我以为这有点含糊不清,“那么只要发布一个新的动态库就可以修复这些bug。”我认为如果你说“那么只是发布一个新版本* *动态库将修复错误 - 你不需要用它发布一个新的可执行文件就会更清楚。” – Will

0
  • 你可能希望在不将库的依赖,创造一个单一的可执行文件。
  • 据我所知静态库应该有点快。

缺点:连接共享库不仅增加了每个可执行文件也会加载的可执行文件大小。如果您在多个可执行文件中使用该库,那么它将多次存储在内存中。

位置相关代码意味着在库的创建时,库的确切位置并不知道,因此只有相对内存寻址可用(例如:从该指令跳转到+50字节并从该处执行)

+0

大多数操作系统实际上将共享共享库的只读部分的内存映射以及从相同底层文件加载该库的所有进程。这实际上是共享库的优点之一,而不是缺点。 – acm