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绑定到它自己的依赖项。
如果静态库包含来自其静态依赖关系的符号,由于多个定义的符号,您会得到各种令人讨厌的警告和错误。
考虑一下情况:
至少这是我从MSVS世界的经验。
链接地址: http://www.djcxy.com/p/60527.html上一篇: C++ Why does this specific situation cause a symbol linking error?