在'C'和Linux中,我是否需要静态链接的静态库,或者我已有的共享库就足够了? 如果不是,为什么?(它们不包含相同的数据吗?)
在'C'和Linux中,我是否需要静态链接的静态库,或者我已有的共享库就足够了? 如果不是,为什么?(它们不包含相同的数据吗?)
是的,构建静态链接的可执行文件需要静态库。
静态库是编译对象的捆绑。当您与库进行静态链接时,实际上相当于将该库的编译结果解包到当前项目中,并将其用作自己的对象。
动态库已经被链接。这意味着一些信息(例如重定位)已经被修复并抛弃了。
此外,动态库必须编译为位置独立代码。这不是静态库的限制,并且在某些常见平台(如x86)上会导致性能显着差异。
存在像ELF Statifier这样的工具,试图将动态链接库捆绑到动态链接可执行文件中,但在所有情况下生成正确工作的结果非常困难。
不存在静态编译,只有静态链接。为此,您需要静态库。 静态链接和动态链接的区别在于前者可以在链接时间(编译时间后)解决名称,而后者则在程序开始运行时解决名称。
静态库和动态库可能包含相同的信息,这取决于很多因素。 在选择是静态链接还是动态链接您的代码时非常重要,这通常会影响应用程序架构。
你将链接到静态链接程序的所有库都必须是静态变体。虽然动态(libfoo.so)和静态(libfoo.a)库中都有相同的函数,但它们是不同的格式文件,因此您需要匹配类型的程序。