循环链接库
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
。
我们有一个应用程序,其中的代码组织在几个库中,其中一些依赖于其他库,因此我们有一个依赖树,如
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
。