发布
社区首页 >问答首页 >当符号存在时,为什么“符号查找错误”,“未定义符号”

当符号存在时,为什么“符号查找错误”,“未定义符号”
EN

Stack Overflow用户
提问于 2020-04-23 10:14:28
回答 1查看 5.8K关注 0票数 1

这最初是一个PySide2错误,但是在这就是答案之后进行了一些调试之后,我认为这可能是一个通用的c++问题,不管应用程序和未定义的符号是什么。

当我运行/home/me/.local/lib/python3.8/site-packages/PySide2/designer并关闭它时,它将崩溃

代码语言:javascript
代码运行次数:0
复制
/home/me/.local/lib/python3.8/site-packages/PySide2/designer:
  symbol lookup error: /home/me/.local/lib/python3.8/site-packages/PySide2/designer:
  undefined symbol: _ZdlPvm, version Qt_5

但这不应该发生。首先,确实加载了系统libstdc++:

代码语言:javascript
代码运行次数:0
复制
$ LD_DEBUG=libs pyside2-designer 2>&1 |grep libstdc++
   1926528: find library=libstdc++.so.6 [0]; searching
   1926528:   trying file=/home/me/.local/lib/python3.8/site-packages/shiboken2/libstdc++.so.6
   1926528:   trying file=/usr/lib/libstdc++.so.6
   1926528: calling init: /usr/lib/libstdc++.so.6
   1926533: find library=libstdc++.so.6 [0]; searching
   1926533:   trying file=/usr/lib/libstdc++.so.6
   1926533: calling init: /usr/lib/libstdc++.so.6
   1926528: calling fini: /usr/lib/libstdc++.so.6 [0]

其次,符号"_ZdlPvm“确实是在/usr/lib/libstdc++.so.6中定义的。

代码语言:javascript
代码运行次数:0
复制
$ nm -D /usr/lib/libstdc++.so.6 |grep _ZdlPvm
00000000000a1ca0 T _ZdlPvm
00000000000a3c30 T _ZdlPvmSt11align_val_t

除非这两个事实不能保证找到和使用符号_ZdlPvm,否则我想知道如何保证它以及动态加载是如何工作的。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-23 11:25:43

完整的错误消息是

代码语言:javascript
代码运行次数:0
复制
{...}/lib/python3.6/site-packages/PySide2/designer: relocation error: 
     {...}/lib/python3.6/site-packages/PySide2/designer: symbol 
     _ZdlPvm version Qt_5 not defined in file libQt5Core.so.5 with
      link time reference

您的包是针对(它自己的Qt库的本地副本)链接的,但是您没有使用它们(您没有将相关目录添加到您的LD_LIBRARY_PATH中)。让我们看看:

代码语言:javascript
代码运行次数:0
复制
$ nm -D {...}/lib/python3.6/site-packages/PySide2/Qt/lib/libQt5Core.so.5 | grep _ZdlPvm
00000000003b95e0 T _ZdlPvm

$ nm -D /usr/lib64/libQt5Core.so.5 | grep _ZdlPvm
                 U _ZdlPvm

为什么它关心在哪里定义_ZdlPvm?嗯,因为这个符号不仅仅是名字。也有符号版本。看到这条消息的这个小version Qt_5部分了吗?

代码语言:javascript
代码运行次数:0
复制
$ nm --with-symbol-versions -D /usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/libstdc++.so.6 | grep _ZdlPvm
00000000000d0060 T _ZdlPvm@@CXXABI_1.3.9
00000000000d1ed0 T _ZdlPvmSt11align_val_t@@CXXABI_1.3.11

$ nm --with-symbol-versions -D {...}/lib/python3.6/site-packages/PySide2/Qt/lib/libQt5Core.so.5 | grep _ZdlPvm
00000000003b95e0 T _ZdlPvm@@Qt_5

因此,本地libQt5Core.so.5定义的符号实际上不同于libstdc++.so.6定义的符号。

我试图将Qt的本地副本添加到LD_LIBRARY_PATH中,但结果是它无法找到Kerberos库。我的系统不使用Kerberos,所以它们不存在。如果您使用像Ubuntu这样的标准Linux发行版,您可能会有更好的运气。

总之,包中有一个bug。如果它需要使用自己的Qt副本,它应该想出一种方法来实际使用它,而无需用户跳转。这不是C++或任何其他语言的问题。这是一个更普遍的问题的表现,称为"DLL地狱“。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61384686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档