是库依赖问题可以通过接口避免



今天,我从我的一个拼贴画中学到了关于库依赖关系的新知识,我想确保它是正确的。

所以通常如果一个库依赖于(libB.a)另一个(libA.a) 据我所知,比在制作文件顺序应该是 -lB -lA。最低级别的库(其他库所依赖的库)应该在 -l 列表的末尾。

今天有人告诉我,如果libB对libA的依赖是一个接口,那么顺序就无关紧要了。我已经解释了,因为这种依赖关系将在运行时解决,在链接阶段编译器不需要来自libA的任何机器代码信息。使用头文件中的符号就足够了。

我想确认我是否正确理解了我被告知的内容?在使用接口的情况下,链接库顺序是否正确无关紧要。如果正确,它是编译器依赖还是在语言本身中指定?

在考虑动态链接时,所说的也是有意义的,但是为什么可以在没有实际机器代码的情况下创建libA中的对象?

我希望我解释了我的观点,如果没有,我可以尝试制作一个示例代码。

基本上,顺序对使用 GNUld链接器(或类似)解析静态库和对象(嗯,也包括"主"对象)中的依赖关系很重要。这是因为ld只从左到右扫描一次该列表,"忘记"到目前为止未引用的每个符号。顺便说一句。可以使用链接器选项修改此类行为-Wl,-u,sym该选项强制ld在扫描之前创建对sym的引用。(尽管如果libB.a需要libA.a的十几个符号,它没有多大用处)。

然而,所有上述内容都不适用于(1)其他链接器(如果它们继续跟踪所有符号,无论顺序如何);也不适用于(2)共享库/DLL之间的依赖关系(因为它是操作系统加载器的工作,而不是链接器的工作);也不是(3)使用dlsym()GetProcAddress()等的运行时动态链接(嗯,显然,链接器对此一无所知);也不是(4)公开"灵活接口"的库, 例如Microsoft COM,它本质上是运行时动态链接和"工厂模式"的混合体。

最新更新