确保编译共享库的模块化依赖项

时间:2012-01-22 22:53:48

标签: c++

假设我有一个名为A.so的库。这个共享库在一组接口上工作,并且有一个定义“void init()”方法的头,但是没有实现它。此外,在A.so。

的范围内永远不会调用此方法

然后我有一个名为B.so的库,它实现了这些接口,就像后端一样。此外,该库实现了init方法(如果目标是可执行文件,则可能是调用它的主要方法)。但我没有指定它的依赖关系。这意味着ldd -r -d B.so会产生很多未定义的错误,这是可以的。

当我创建一个实现init方法的目标可执行文件时,一切正常,因为当链接显示未定义的引用时,我可以手动将它们添加到可执行文件中。

问题是当后端是另一个共享库C.so并且它没有实现“void init()”方法时。由于A.so库与B.so没有“硬”依赖关系,因此C.so的链接不包括B.so的定义,因此由于未定义的引用而导致对C.so的dlopen失败。

我知道强迫A.so依赖于B.so的一种简单方法是定义一个虚拟方法并在A代码中调用它,但我发现它有点蹩脚所以我要求在这里看看如果有更好的方法可以做到这一点。

示例:

A.so (no dependencies)

B.so (compilation spec 1)
   \ X.so
   \ Y.so

B.so (compilation spec 2)
   \ O.so
   \ Q.so

C.so 
   \ A.so
   \ B.so (this is not being included as A nor C link explicitly against B)

D.exe
   \ A.so
   \ B.so (this is include because D.exe has to implement the "void init()")

建议的解决方案:

A.so
   \ declares and call "void check_backend()"

B.so
   \ implements "void check_backend()"

0 个答案:

没有答案