我正在开发一个应用程序,其中有一个“核心”和多个插件。我在 Linux 上使用 Qt,我使用 Qt 的插件加载系统。插件创建为共享对象文件 (*.so) 并动态加载。如果我使用插件链接到一个库,并且该库链接到其他库,我经常会从应用程序中收到“ undefined symbol ”错误。为了解决这个问题,我还需要将插件链接到其他库...
LibA 的插件链接
LibA 链接到 LibB、LibC
LibA 被编译为静态的。当我尝试加载插件时,我会收到一个 undefined symbol 错误,如下所示:
unable to load shared library 'myPluginName.so':
myPluginName.so: undefined symbol: _ZN3BlahBlahD2Ev
为了解决这个问题,我可以使用 filt 来解开符号名称,找出符号属于哪个库(比如 LibB),然后像这样编译:
到 LibA、LibB 的插件链接
LibA 链接到 LibB、LibC
不知道为什么会报错。如果 LibA 链接到 LibB 和 LibC,为什么 Plugin 也必须“知道”LibB?为什么这个错误不会在所有情况下发生(即没有与 LibC 的 undefined symbol 相关的错误)?
如有任何意见,我将不胜感激。
-kf
最佳答案
您必须牢记,静态库只不过是打包到单个文件中的目标文件的集合。如果您的插件需要 LibA,而 LibA 需要 LibB 和 LibC,那么当您链接您的插件时,您必须告诉链接器 LibA、LibB 和 LibC 在哪里。
如果您使用动态库,情况就会不同。 .so 已经链接,所以它的所有引用都已经解析。如果 LibA 是一个动态链接库,那么您的插件只需要链接到 LibA.so,因为链接步骤已经发生以将 LibA 绑定(bind)到它自己的依赖项。
关于C++ 为什么这种特定情况会导致符号链接(symbolic link)错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7382014/