2016-05-30 87 views
0

我们必须在代码中几个图书馆举办了一个应用程序,其中一些依赖于其他的库,所以我们有像循环链接库

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

的依赖关系树最近有人在添加了一个新的方法lib3,它依赖于lib2中定义的类,并且由于这是生成循环包含,所以我们对lib3中头文件中所需的类进行了前向声明。

现在,每个库都被编译为一个静态库,然后链接到其各自的链接列表中,因此lib2位于lib2的链接列表中,并且lib3也位于lib2的喜欢列表中。

到目前为止,这工作完美,但我想知道有这种编译和链接依赖关系的缺点。我认为可能会发生这样的情况:lib2中的更改不会被lib3注意,除非它被重新编译,但是我检查并且lib2中任何头文件中的任何更改都会触发lib3的重新编译(这里有点运气)。

是否还有其他重要的缺点我应该知道?

+0

*“... lib2中任何头文件的任何更改都会触发lib3的重新编译。”*为什么?这是你在构建系统中强加的东西,还是由于#include语句的模式而自然产生的?如果是后者,你确定所有那些'#include'语句是否真的有必要? – Beta

+0

我在这种情况下使用的一种方法是在一个库中定义一个具有纯虚函数的基类。在其他库中从它派生。然后你减少依赖。也许还有其他方法。我认为你应该避免循环依赖。 – user2672165

+0

随着循环依赖性,您必须始终与所有库链接。然后你可以创建一个大的静态库文件。 – user2672165

回答

2

有没有其他重要的缺点我应该知道?

那么,order of libraries指定的链接实际上很重要。

要摆脱链接器用来解决这些依赖关系的顺序,通常会提供一个选项来对它们进行分组,例如这些只使用单个文件池。

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