从输出结果来看,尽管已经设置了 QT_PLUGIN_PATH
和 LD_LIBRARY_PATH
来指向 /opt/deepin-shared-libs/Qt5.15.10gles
,程序仍然报错,加载的 libqsqlite.so
仍来自系统路径 /usr/lib/x86_64-linux-gnu/qt5/plugins/sqldrivers/libqsqlite.so
,导致符号不匹配。
问题原因
- Qt 插件加载顺序问题
即使指定了QT_PLUGIN_PATH
,程序可能仍然优先使用系统默认的插件路径/usr/lib/x86_64-linux-gnu/qt5/plugins/sqldrivers/libqsqlite.so
。 libsqlite3.so
版本冲突/opt/deepin-shared-libs/Qt5.15.10gles
和系统的/usr/lib/x86_64-linux-gnu
中可能存在不同版本的libsqlite3.so
,导致符号不匹配。
解决方法
1. 确保正确加载 /opt/deepin-shared-libs
的插件
强制让程序只加载 /opt/deepin-shared-libs/Qt5.15.10gles/plugins/sqldrivers/libqsqlite.so
,可以通过以下方式实现:
备份系统插件路径的
libqsqlite.so
:(应该移到别处目录下我实际测试他还是会调用备份文件)sudo mv /usr/lib/x86_64-linux-gnu/qt5/plugins/sqldrivers/libqsqlite.so /usr/lib/x86_64-linux-gnu/qt5/plugins/sqldrivers/libqsqlite.so.bak
创建软链接指向
/opt/deepin-shared-libs
的插件:sudo ln -s /opt/deepin-shared-libs/Qt5.15.10gles/plugins/sqldrivers/libqsqlite.so /usr/lib/x86_64-linux-gnu/qt5/plugins/sqldrivers/libqsqlite.so
重新运行程序:
sudo /usr/bin/deepin-home-appstore-daemon
2. 检查加载的动态库路径
使用 LD_DEBUG=libs
检查程序实际加载了哪些动态库,特别是 libqsqlite.so
和 libsqlite3.so
:
LD_DEBUG=libs sudo /usr/bin/deepin-home-appstore-daemon 2>&1 | grep libsqlite
- 如果仍然加载了错误的
libqsqlite.so
或libsqlite3.so
,需要通过LD_PRELOAD
强制加载正确的版本。
3. 使用 LD_PRELOAD
强制加载库
通过 LD_PRELOAD
明确指定 /opt/deepin-shared-libs
下的 libsqlite3.so
和 libqsqlite.so
:
export QT_PLUGIN_PATH=/opt/deepin-shared-libs/Qt5.15.10gles/plugins
export LD_PRELOAD=/opt/deepin-shared-libs/libsqlite3.so
sudo /usr/bin/deepin-home-appstore-daemon
4. 确保 /opt/deepin-shared-libs
的环境完整
确认 /opt/deepin-shared-libs
中的动态库是完整的,特别是 libsqlite3.so
是否包含 sqlite3_column_table_name16
符号:
nm -D /opt/deepin-shared-libs/libsqlite3.so | grep sqlite3_column_table_name16
- 如果符号缺失,需要更新
/opt/deepin-shared-libs/libsqlite3.so
。 - 如果符号存在但问题仍未解决,可能需要替换
/opt/deepin-shared-libs/Qt5.15.10gles/plugins/sqldrivers/libqsqlite.so
。
5. 重建动态库缓存
确保系统正确加载动态库,清除并重新生成动态库缓存:
sudo ldconfig
验证修复
完成上述步骤后,重新运行程序:
sudo /usr/bin/deepin-home-appstore-daemon
如果问题仍然存在
提供以下详细信息以继续分析:
LD_DEBUG=libs
的完整输出。nm -D /opt/deepin-shared-libs/libsqlite3.so | grep sqlite3_column_table_name16
的结果。- 重新运行程序后的具体报错信息。
根据这些信息,我可以进一步协助你解决问题!