C++ 为什么这种特定情况会导致符号链接(symbolic link)错误?

标签 c++ qt linker

我正在开发一个应用程序,其中有一个“核心”和多个插件。我在 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/

相关文章:

c++ - 如何在后台启动 GUI 应用程序?

c++ - QGraphicsLineItem::paint() 工件

C++ 静态库

c++ - 当我在 C++ 程序中包含 RInside header 时,如何让链接器工作?

C程序中的C++ dll

c++ - 是否有任何 API 可以在 Windows 中获取路径 "C:\Documents and Settings"?

python - pyqt QTableView 删除行导致异常 : Qt attempts to create header for removed row

c++ - 将弱符号和局部符号链接(symbolic link)在一起时,可能的GCC链接器错误导致错误

c++ - mem_fn 到 member 的 mem_fn

C++ : Using an array in a nested class definition (OOP)