【发布时间】:2009-06-20 17:54:19
【问题描述】:
在“C”,Linux,
我需要静态库来静态链接,还是我拥有的共享库就足够了? 如果不是,为什么不呢? (它们不是包含相同的数据吗?)
【问题讨论】:
标签: c linux static-libraries static-linking
在“C”,Linux,
我需要静态库来静态链接,还是我拥有的共享库就足够了? 如果不是,为什么不呢? (它们不是包含相同的数据吗?)
【问题讨论】:
标签: c linux static-libraries static-linking
是的,您需要静态库来构建静态链接的可执行文件。
静态库是编译对象的捆绑包。当您静态链接到库时,它实际上与获取该库的编译结果,在当前项目中解压缩它们并像使用它们一样使用它们是您自己的对象。
动态库已链接。这意味着像搬迁这样的一些信息已经被修复并丢弃了。
此外,动态库必须编译为与位置无关的代码。这不是对静态库的限制,会导致在某些常见平台(如 x86)上的性能存在显着差异。
存在像 ELF Statifier 这样的工具,它们试图将动态链接的库捆绑到动态链接的可执行文件中,但在所有情况下都很难生成正确工作的结果。
【讨论】:
没有静态编译,只有静态链接。为此,您需要静态库。静态链接和动态链接的区别在于,前者在链接时(编译时之后)解析名称,而后者在程序开始运行时解析名称。
静态库和动态库可能包含也可能不包含相同的信息,具体取决于许多因素。是静态链接还是动态链接代码的决定很重要,并且通常会影响应用程序架构。
【讨论】:
您链接到静态链接程序的所有库都必须是静态变体。虽然动态 (libfoo.so) 和静态 (libfoo.a) 库具有相同的功能,但它们是不同的格式文件,因此您需要与程序匹配的类型。
【讨论】:
另一个选择是 Ermine (http://magicErmine.com) 它类似于 statifier,但能够处理内存随机化。
【讨论】: