共享和静态库

时间:2011-06-24 12:36:04

标签: gcc cygwin

任何人都可以解释一下gcc(makefile)中共享库和静态库之间的区别是什么

我读到静态库是独立代码,但它增加了可执行文件的大小

但是共享库却动态地链接了这些函数,并没有增加可执行文件的大小

我无法理解这两者之间的区别。

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

他们说共享库是一个位置相关的代码

位置相关代码是什么意思?

如果共享库没有增加代码,并且静态库增加了代码大小 然后我们可以直接去共享图书馆。

但为什么我们还有静态库,它的实际用途是什么。

请帮帮我们

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

  • 您可能希望创建一个没有库依赖项的可执行文件。
  • 据我所知,静态库应该更快一些。

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

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