10

在“C”上,Linux,

我需要静态库来静态链接,还是我拥有的共享库就足够了?如果不是,为什么不呢?(它们不包含相同的数据吗?)

4

4 回答 4

11

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

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

动态库已链接。这意味着像搬迁这样的一些信息已经被修复并丢弃了。

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

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

于 2009-06-20T18:05:53.637 回答
6

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

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

于 2009-06-20T17:59:02.933 回答
2

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

于 2009-06-20T18:01:12.633 回答
1

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

于 2009-07-23T07:29:44.453 回答