【问题标题】:Symbol resolution in static vs dynamic libraries静态库与动态库中的符号解析
【发布时间】:2012-02-15 19:07:58
【问题描述】:

有一个免费软件项目可以构建一些静态 c++ 库,然后 链接它们以制作二进制文件。我想将库分开为 .so 文件用于动态链接(因此其他项目可能会使用 库)。一个库构建得很好,但是当我尝试链接时 它,我得到“未定义的引用”错误。

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

非常感谢。

【问题讨论】:

  • 未引用的对象在静态库的构建中实际位于何处?是其他静态库、其他共享库还是 .o 文件?参考什么,图书馆之一?

标签: c++ c g++ shared-libraries ld


【解决方案1】:

静态库,用 ar 创建的只是一堆目标文件。 ar 是一个非常简单的归档器。链接时没有解决依赖关系,请参阅 ar 的手册页。

另一方面,

共享对象,或者您所称的动态库是一种非常不同的野兽。它们实现 ELF 二进制格式并具有复杂的规则集。它们还具有初始化代码,并且在链接时解决了一些依赖关系。请参阅http://www.akkadia.org/drepper/dsohowto.pdfhttp://www.akkadia.org/drepper/goodpractice.pdf 了解更深入的介绍。

【讨论】:

  • 谢谢,乔格。这些链接很有帮助。
  • 如果答案有帮助,那么您仍然可以投票/接受它,JLV。
【解决方案2】:

但是当我尝试链接它时,我得到“未定义的引用”错误。

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

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

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 2014-11-23
    • 2011-11-05
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    相关资源
    最近更新 更多