循环链接库

Circular linking libraries

我们有一个应用程序,其中的代码组织在几个库中,其中一些依赖于其他库,因此我们有一个依赖树,如

App
 |
 +--------+--------+
 |        |        |
 v        v        v
lib1     lib2     lib3
 |        |
 v        v
lib3     lib3

最近有人在 lib3 中添加了一个新方法,它依赖于 lib2 中定义的 class,并且由于它正在生成循环包含,我们在头文件存在于 lib3.h 中。

现在,每个库都被编译成一个静态库,然后链接到它各自的链接列表,所以lib2在lib2的链接列表中,lib3也在lib2的链接列表中。

到目前为止,这工作得很好,但我想知道与具有这种编译和链接依赖关系相关的缺点。我认为 lib2 中的更改可能不会被 lib3 注意到,除非它被重新编译,但我检查过,lib2 中任何头文件的任何更改都会触发 lib3 的重新编译(这里有点运气)。

还有什么我应该注意的其他重要缺点吗?

Is there any other important drawback I should be aware of??

好吧,为链接指定的 order of libraries 实际上很重要。

为了摆脱链接器用来解决这些依赖关系的顺序,通常会提供一个选项来对它们进行分组,就像这些只是使用单个池 .obj/.o文件。

对于 GCC 编译器,这些选项是 -Wl,--start-group,-Wl,--end-group