假设我们有一个名为“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
似乎是目前的命令,是这样吗?如果任何动态库与静态库之间存在依赖关系,或者相反,该怎么办?
最佳答案
在静态情况下,这并不重要,因为您实际上并不链接静态库-您所做的只是将一些目标文件打包到一个文件中。您只需编译目标文件,即可立即创建静态库。
动态库的情况更加复杂,有两个方面:
区别在于,如果使用前一种方法,则在链接可执行文件时必须在命令行上指定所有三个库(-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/