我在libA.so
中使用了libB.so
中的函数,并且在libB.so
中使用了libA.so
中的函数!因此,我无法编译这些库。我怎样才能编译这两个库?我应该使用第三个图书馆并将家属移到这个图书馆吗?我用过qt和c ++
更新:在编译libA.so get错误找不到libB.so并在libB.so中获取错误找不到libA.so
这对于将来的重复使用似乎有点问题,您可能希望在这些库之间区分不同的函数或创建第三个包含所有“工具”功能的qntxswpoi和LibA
函数彼此无关。
大胖免责声明只有在绝对必要时才这样做。首选方法是重构项目结构,使其不包含依赖项循环。
在生成共享库时,链接器通常不需要了解其他共享库。可以在命令行中使用它们,但这是可选的。例:
libB
编译和链接:
// libA.cpp
extern void funcB();
void funcA() {
funcB();
}
g++ -fPIC -c libA.cpp
g++ -shared -o libA.so libA.o
应该住在funcB
,但我们并没有告诉链接器在哪里找到它。该符号只是在libB.so
中未定义,并且(希望)在加载时解析。
libA.so
编译和链接,现在显式使用libA.so(忽略无限递归,它只是一个例子):
// libB.cpp
extern void funcA();
void funcB() {
funcA();
}
现在可以在加载g++ -fPIC -c libB.cpp
g++ -shared -o libB.so libB.o -L/where/libA/is -lA
之前加载libB.so
的可执行文件,否则无法加载libA.so
。这很容易(只用libA.so
链接可执行文件,而不是libB.so
),但有时可能不方便。所以在建立libA.so
之后可以重新连接libA.so
:
libB.so
现在可以将可执行文件链接到libA或libB,另一个可以自动获取。
我在libB.so中使用了libA.so中的函数,而在libA.so中使用了libB.so中的函数!
这是错误的设计。 g++ -shared -o libA.so libA.o -L /where/libB/is -lB
不能,甚至间接依赖自己。这种循环是一种非常错误的症状,你误解了软件库是什么(它不仅仅是一个随机的函数集合,也不是一个目标文件;它必须以某种方式成为一个“软件模块”而且它是相关的到library并经常完全定义和实现相关的modular programming集合。
所以扔掉abstract data types和libA.so
。并制作一个单独的libB.so
,其中包含您在libAB.so
和libA.so
共享对象(而非正版库)中放入的所有代码。
libB.so
提供了解决问题的技术方法,但从本质上讲,你的设计是错误的并且你滥用库(你不能把你的answer from n.m.或你的libA
称为库,即使你把它们构建为libB
中的一些共享对象)。
您还可以通过在ELF中添加一些间接来设计代码,或者在某些变量或数据中添加callbacks或closures(并提供一些设置这些回调的方法,或者在运行时初始化闭包或函数指针)。由于你使用function pointers,考虑也适当地定义你的新Qt(它们基于一些回调机制)。
阅读Qt signals and slots和Drepper的Program Library HowTo论文了解更多信息。
最后我解决了。
作为@ n.m.说我们不需要在编译时链接libA.so和libB.so,所以我在构建它们时删除How to Write Shared libraries和-lA
并且我没有得到任何错误。在想要使用libA.so或libB.so的应用程序中,我将它们与-lB
或-lA
链接。所以这个工作正常。