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

时间:2011-09-11 23:31:40

标签: c++ qt linker

我正在开发一个有'核心'和多个插件的应用程序。我在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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

如果静态库要包含静态依赖项中的符号,那么由于多次定义的符号,您将获得各种令人讨厌的警告和错误。

考虑这个案例:

  • libA依赖于libB和libC
  • => libB依赖于libD
  • => libC依赖于libD

至少这是我在MSVS世界的经历。