我是否需要静态库来静态链接?

时间:2009-06-20 17:54:20

标签: c linux static-libraries static-linking

在'C',Linux,

我是否需要静态链接静态链接,或者我需要的共享库? 如果没有,为什么不呢? (它们不包含相同的数据吗?)

4 个答案:

答案 0 :(得分:11)

是的,您需要静态库来构建静态链接的可执行文件。

静态库是编译对象的捆绑包。当您静态链接到库时,它实际上与获取该库的编译结果,在当前项目中解压缩它们并使用它们就像它们是您自己的对象一样。

动态库已经链接。这意味着某些信息(如重定位)已经被修复并丢弃。

此外,必须将动态库编译为与位置无关的代码。这不是对静态库的限制,并且导致某些常见平台(如x86)的性能存在显着差异。

存在像ELF Statifier这样的工具,它们试图将动态链接库捆绑成动态链接的可执行文件,但是在所有情况下都很难生成正确工作的结果。

答案 1 :(得分:6)

没有静态编译,只有静态链接。为此,您需要静态库。静态和动态链接之间的区别在于,对于前者,名称在链接时解析(在编译时之后),对于后者,它们在程序开始运行时被解析。

静态和动态库可能包含也可能不包含相同的信息,具体取决于许多因素。关于是静态还是动态地链接代码的决定是一个重要的决定,并且经常会影响应用程序架构。

答案 2 :(得分:2)

链接到静态链接程序的所有库都必须是静态变体。虽然动态(libfoo.so)和静态(libfoo.a)库具有相同的功能,但它们是不同的格式文件,因此您需要程序的匹配类型。

答案 3 :(得分:1)

另一种选择是Ermine(http://magicErmine.com) 它就像statifier,但能够处理内存随机化。