将两个库相互链接

问题描述 投票:0回答:4

我在libA.so中使用了libB.so中的函数,并且在libB.so中使用了libA.so中的函数!因此,我无法编译这些库。我怎样才能编译这两个库?我应该使用第三个图书馆并将家属移到这个图书馆吗?我用过qt和c ++

更新:在编译libA.so get错误找不到libB.so并在libB.so中获取错误找不到libA.so

c++ c design-patterns shared-libraries
4个回答
1
投票

这对于将来的重复使用似乎有点问题,您可能希望在这些库之间区分不同的函数或创建第三个包含所有“工具”功能的qntxswpoi和LibA函数彼此无关。


1
投票

大胖免责声明只有在绝对必要时才这样做。首选方法是重构项目结构,使其不包含依赖项循环。

在生成共享库时,链接器通常不需要了解其他共享库。可以在命令行中使用它们,但这是可选的。例:

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,另一个可以自动获取。


0
投票

我在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 typeslibA.so。并制作一个单独的libB.so,其中包含您在libAB.solibA.so共享对象(而非正版库)中放入的所有代码。

libB.so提供了解决问题的技术方法,但从本质上讲,你的设计是错误的并且你滥用库(你不能把你的answer from n.m.或你的libA称为库,即使你把它们构建为libB中的一些共享对象)。

您还可以通过在ELF中添加一些间接来设计代码,或者在某些变量或数据中添加callbacksclosures(并提供一些设置这些回调的方法,或者在运行时初始化闭包或函数指针)。由于你使用function pointers,考虑也适当地定义你的新Qt(它们基于一些回调机制)。

阅读Qt signals and slots和Drepper的Program Library HowTo论文了解更多信息。


-1
投票

最后我解决了。 作为@ n.m.说我们不需要在编译时链接libA.so和libB.so,所以我在构建它们时删除How to Write Shared libraries-lA并且我没有得到任何错误。在想要使用libA.so或libB.so的应用程序中,我将它们与-lB-lA链接。所以这个工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.