有一个免费的软件项目可以构建一些静态的c ++库 将它们链接起来制作二进制文件我想将这些库分开 .so文件用于动态链接(因此其他项目可能会使用 lib)。一个库构建得很好,但是当我尝试链接时 它,我得到“未定义的引用”错误。
这些很容易追踪和修复(代码引用了那些 .h文件中的方法,但相应的.cc文件不是 包含在Makefile编译命令中)。但是,我是 想知道为什么,作为一般事项,图书馆将仅仅联系起来 作为静态库但不是动态库。是什么 g ++和ld在一个案例中但不在另一个案例中吗?
非常感谢。
答案 0 :(得分:5)
静态库只是一堆目标文件。 ar 是一个非常简单的归档程序。链接时没有解析依赖关系,请参阅 ar 的手册页。
另一方面,共享对象,或者您调用的动态库是一种非常不同的野兽。它们实现ELF二进制格式并具有复杂的规则集。它们还具有初始化代码,并且在链接时解析了一些依赖项。有关更深入的介绍,请参阅http://www.akkadia.org/drepper/dsohowto.pdf和http://www.akkadia.org/drepper/goodpractice.pdf。
答案 1 :(得分:0)
但是当我尝试链接它时,我得到“未定义的引用”错误。
向我们展示您的链接命令。链接共享库时,“未定义的引用”错误通常不,因为共享库允许(默认情况下)具有未解析的符号。
或者您是否意味着在将最终可执行文件与共享库链接时会出现“未定义的引用”错误?