共享库含目标符号,程序仍提示未定义?Qt插件加载故障问询
问题描述
在RedHat Linux系统上使用QtCreator构建程序,运行时输出如下错误:
QFactoryLoader::QFactoryLoader() checking directory path "/home/tester/vdcds/mmd_2.1/bin/xcbglintegrations" ... QFactoryLoader::QFactoryLoader() looking at "/home/tester/vdcds/mmd_2.1/bin/xcbglintegrations/libqxcb-glx-integration.so" Found metadata in lib /home/tester/vdcds/mmd_2.1/bin/xcbglintegrations/libqxcb-glx-integration.so, metadata= { "IID": "org.qt-project.Qt.QPA.Xcb.QXcbGlIntegrationFactoryInterface.5.5", "MetaData": { "Keys": [ "xcb_glx" ] }, "className": "QXcbGlxIntegrationPlugin", "debug": false, "version": 328960 } Got keys from plugin meta data ("xcb_glx") Cannot load library /home/tester/vdcds/mmd_2.1/bin/xcbglintegrations/libqxcb-glx-integration.so: (/home/tester/vdcds/mmd_2.1/bin/xcbglintegrations/libqxcb-glx-integration.so: undefined symbol: _ZN10QXcbWindow18handleGenericEventEP19xcb_generic_event_tPl) QLibraryPrivate::loadPlugin failed on "/home/tester/vdcds/mmd_2.1/bin/xcbglintegrations/libqxcb-glx-integration.so" : "Cannot load library /home/tester/vdcds/mmd_2.1/bin/xcbglintegrations/libqxcb-glx-integration.so: (/home/tester/vdcds/mmd_2.1/bin/xcbglintegrations/libqxcb-glx-integration.so: undefined symbol: _ZN10QXcbWindow18handleGenericEventEP19xcb_generic_event_tPl)" QXcbIntegration: Cannot create platform OpenGL context, neither GLX nor EGL are enabled
但使用strings命令查看该库时,能找到提示未定义的符号:
tester@localhost~/work/230627_1500$ strings /home/tester/vdcds/mmd_2.1/bin/xcbglintegrations/libqxcb-glx-integration.so | grep _ZN10QXcbWindow18handleGenericEventEP19xcb_generic_event_tPl _ZN10QXcbWindow18handleGenericEventEP19xcb_generic_event_tPl
疑问:该符号是否在其他层面不存在?有没有命令可以查看库中可用的符号?程序无法显示预期图像,怀疑使用了错误的库,但看起来库是正确的。
分析与解决方法
符号存在但提示未定义的原因
strings仅能提取文件中的字符串,无法区分符号是库自身导出的定义符号还是库需要外部提供的引用符号。出现这种情况通常有以下可能:
- 该符号是引用符号,需要依赖Qt的Xcb平台库(如
libQt5XcbQpa.so)提供定义,但运行时加载的依赖库中没有这个符号 - 运行时加载的依赖库版本与编译插件时使用的版本不匹配,符号签名或存在性发生了变化
- 程序运行时的库加载路径异常,加载了系统默认的Qt库而非项目配套版本
查看库中可用符号的命令
以下命令可查看动态库的符号表,明确符号状态:
nm -D /path/to/lib.so:查看动态符号表,T表示已定义的全局导出符号,U表示未定义的引用符号objdump -T /path/to/lib.so:输出更详细的动态符号表信息,包含符号权限、版本等readelf -s /path/to/lib.so:解析ELF格式的符号表,信息最全面,适合深入排查
具体排查步骤
检查目标库的符号状态
执行命令确认符号类型:nm -D /home/tester/vdcds/mmd_2.1/bin/xcbglintegrations/libqxcb-glx-integration.so | grep _ZN10QXcbWindow18handleGenericEventEP19xcb_generic_event_tPl若输出以
U开头,说明该符号是引用符号,需依赖其他库;若为T开头,需进一步检查依赖库。检查依赖库是否包含该符号
先查看插件依赖的Qt Xcb库路径:ldd /home/tester/vdcds/mmd_2.1/bin/xcbglintegrations/libqxcb-glx-integration.so | grep libQt5XcbQpa再检查该依赖库是否包含目标符号:
nm -D <依赖库路径> | grep _ZN10QXcbWindow18handleGenericEventEP19xcb_generic_event_tPl修正运行时库加载路径
强制程序优先加载项目目录下的库,避免使用系统默认版本:export LD_LIBRARY_PATH=/home/tester/vdcds/mmd_2.1/bin:$LD_LIBRARY_PATH ./你的程序名验证构建配置
在QtCreator中确认:- 构建套件使用的Qt版本与项目配套库版本一致
- 链接参数已正确包含
xcb、opengl等必要Qt模块
内容的提问来源于stack exchange,提问作者user2566852
相关产品推荐
相关产品推荐

