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

我正在研究一个有'核心'和多个插件的应用程序。 我在Linux上使用Qt,并使用Qt的插件加载器系统。 插件被创建为共享对象文件(* .so)并动态加载。 如果我使用插件链接到库,并且该库链接到其他库,我经常会从应用程序中收到“未定义符号”错误。 为了解决它,我需要将插件链接到其他库以及...

插件链接到LibA

LibA链接LibB,LibC

LibA被编译为静态。 当我尝试加载插件时,会收到未定义的符号错误,如下所示:

unable to load shared library 'myPluginName.so':
myPluginName.so: undefined symbol: _ZN3BlahBlahD2Ev

为了解决这个问题,我可以使用filt来取消符号名称,找出符号属于哪个lib(比如LibB),然后编译如下:

插件链接到LibA,LibB

LibA链接LibB,LibC

我不知道为什么发生错误。 如果LibA链接到LibB和LibC,Plugin为什么还必须“了解”LibB? 为什么在所有情况下都不会出现这种错误(即没有与使用LibC的未定义符号相关的错误)?

我会很感激任何输入。

-kf


您必须记住,静态库只不过是一个打包成单个文件的对象文件的集合。 如果你的插件需要LibA,并且LibA需要LibB和LibC,那么当你连接你的插件时,你必须告诉链接器LibA,LibB和LibC在哪里。

如果你使用动态库,这将是一个不同的故事。 .so已经链接,所以它的所有引用都已经解决了。 如果LibA是一个动态链接库,那么您的插件只需要链接到LibA.so,因为链接步骤已经发生,以便将LibA绑定到它自己的依赖项。


如果静态库包含来自其静态依赖关系的符号,由于多个定义的符号,您会得到各种令人讨厌的警告和错误。

考虑一下情况:

  • libA依赖于libB和libC
  • => libB依赖于libD
  • => libC依赖于libD
  • 至少这是我从MSVS世界的经验。

    链接地址: http://www.djcxy.com/p/60527.html

    上一篇: C++ Why does this specific situation cause a symbol linking error?

    下一篇: Remove unused method in dependency