静态库与动态库中的符号解析

Symbol resolution in static vs dynamic libraries

本文关键字:符号 动态 静态      更新时间:2023-10-16

有一个自由软件项目,它构建了一些静态c++库,然后将它们链接以生成二进制文件。我想把图书馆分成.so文件用于动态链接(因此其他项目可能会使用lib)。一个库构建得很好,但当我尝试链接时它,我得到"未定义的引用"错误。

这些很容易追踪和修复(代码引用了方法,但相应的.cc文件不是包含在Makefile编译命令中)。然而,我,想知道为什么一般情况下,图书馆会可以作为静态库,但不能作为动态库。什么是g++和ld在一种情况下做而不是在另一种情况?

非常感谢。

使用ar创建的

静态库只是一堆对象文件ar是一个非常简单的归档器。链接时没有解析依赖项,请参阅ar的手册页。

另一方面,共享对象或您所称的动态库是一个非常不同的野兽。它们实现ELF二进制格式,并具有复杂的规则集。它们还有初始化代码,一些依赖关系在链接时得到解决。看见http://www.akkadia.org/drepper/dsohowto.pdf和http://www.akkadia.org/drepper/goodpractice.pdf以便进行更深入的介绍。

但当我尝试链接它时,我会得到"未定义引用"错误。

向我们展示您的链接命令。链接共享库时,通常不会出现"未定义引用"错误,因为共享库允许(默认情况下)具有未解析的符号。

或者您的意思是,当您将最终可执行文件链接到共享库时,会出现"未定义引用"错误?