问题描述
在基于 Python/Django 的 open source project 中,我们使用 Travis 和 GH Actions for CI。我们支持 PyPy,因此也为 PyPy 运行 CI 测试。几个月以来,我们无法再成功运行这些 PyPy 测试,因为我们不断遇到此错误:OSError: Cannot load library libgdal.so.20: /usr/lib/libgdal.so.20: undefined symbol: sqlite3_column_table_name
,如果我们运行 Django 的 manage.py test
命令(在帖子末尾回溯),就会发生这种情况。 Django 中一些与 GIS 相关的功能需要 GDAL 库,而后者又需要 SQLite3 库。而且似乎需要在启用列元数据的情况下编译 sqlite3。
仅当安装的 sqlite3
库在没有 SQLITE_ENABLE_COLUMN_METADATA
的情况下编译时才可在本地重现。在 CI 服务器上搜索所有已安装的 sqlite3
库后,很明显 PyPy 安装了自己的 libsqlite3.so.0
副本,它在运行时显然比 OS 安装的版本更喜欢,即使 {{1} } 会引用操作系统库:
ldd
我怀疑 PyPy 在运行时使用不同的库(它自己的副本)的原因是它的动态加载器(在回溯中引用)和它的外观。而且我怀疑它自己的 $ ldd -d /usr/lib/libgdal.so | grep sqlite3
libsqlite3.so.0 => /usr/local/lib/libsqlite3.so.0 (0x00007f09d6124000)
副本是在 CI 提供者安装 PyPy 时创建的。
我发现解决此问题的唯一方法是在运行 PyPy 测试之前显式预加载操作系统级库:
libsqlite3.so.0
然而,这感觉像是一个黑客,我想知道是否有更好的方法来做到这一点?我可以让 PyPy(或 virtualenv)只使用操作系统库而不是自己的副本,或者至少让它更新它的副本?
export LD_PRELOAD=/usr/local/lib/libsqlite3.so.0
的回溯:
undefined symbol error
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)