假设我们有一个名为“my_app”的主要可执行文件,它使用其他几个库:3个库是静态链接的,另3个是动态链接的。
它们应与“my_app”链接的顺序是什么?

但是这些应该以什么顺序链接?

假设我们得到了依赖于libSB的libSA(如在静态A中一样)和依赖于libSB的libSC:

libSA -> libSB -> libSC

和三个动态库:libDA -> libDB -> libDC(libDA是基本的,libDC是最高的)

这些应该以什么顺序链接?基本的第一个还是最后一个?
g++ ... -g libSA libSB libSC -lDA -lDB -lDC -o my_app

似乎是目前的命令,是这样吗?如果任何动态库与静态库之间存在依赖关系,或者相反,该怎么办?

最佳答案

在静态情况下,这并不重要,因为您实际上并不链接静态库-您所做的只是将一些目标文件打包到一个文件中。您只需编译目标文件,即可立即创建静态库。

动态库的情况更加复杂,有两个方面:

  • 共享库的工作方式与静态库完全相同(共享段除外,如果存在共享段的话),这意味着您可以做同样的事情-只要拥有目标文件,就链接您的共享库。例如,这意味着来自libDA的符号将在libDB中显示为undefined
  • 可以在链接共享对象时在命令行上指定要链接的库。这具有与1.相同的效果,但是将libDB标记为需要libDA。

  • 区别在于,如果使用前一种方法,则在链接可执行文件时必须在命令行上指定所有三个库(-lDA,-lDB,-lDC)。如果使用后者,则只需指定-lDC,它将在链接时自动拉出其他文件。请注意,链接时间恰好在程序运行之前(这意味着您甚至可以从不同的库中获得不同版本的符号)。

    这一切都适用于UNIX。 Windows DLL的工作方式完全不同。

    在澄清问题后进行编辑:

    引用ld信息手册。



    这意味着:

    依赖于其他库的任何静态库或对象都应放在命令行之前。如果静态库循环相互依赖,则可以例如。使用-(命令行选项,或将库两次放置在命令行上(-lDA -lDB -lDA)。动态库的顺序无关紧要。

    关于c++ - g++ : In what order should static and dynamic libraries be linked?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/492374/

    10-09 16:37