接口是否可以避免库依赖性问题

时间:2018-01-10 14:08:54

标签: c++ makefile

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

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

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

我想确认一下我的理解是否正确?是否正确链接库顺序在使用接口时无关紧要。如果正确的是编译器依赖或在语言本身中指定?

在考虑动态链接时,有什么说法是有道理的,但是如果没有实际的机器代码,libA中的对象怎么能被创建呢?

我希望我能够解释我的观点,如果不是我可以尝试制作示例代码。

1 个答案:

答案 0 :(得分:1)

基本上,对于使用GNU ld链接器解析静态库和对象(也包括“main”对象)中的依赖关系,命令非常重要(或类似的)。这是因为ld扫描列表只从左到右列出一次“忘记”到目前为止未引用的每个符号。 BTW。可以使用-Wl,-u,sym链接器选项修改此类行为,该选项会强制ld在扫描之前创建对sym的引用。 (尽管如果libB.a需要来自libA.a的十几个符号,它没什么用处。)

然而,所有这些都不适用于(1)其他一些连接器(如果他们继续跟踪所有符号,无论顺序是什么); (2)共享库/ DLL之间的依赖关系(因为它是OS加载器的工作,而不是链接器);也不是(3)使用dlsym()GetProcAddress()等运行时动态链接(显然,链接器对此一无所知);也不是(4)暴露“灵活接口”的库,例如Microsoft COM,它本质上是运行时动态链接和"factory pattern"的混合。