Ubuntu安装Geodjango后运行报错:libgdal.so.20缺失sqlite3符号
undefined symbol: sqlite3_column_table_name 错误 嘿,这个问题我之前碰到过类似的,核心原因就是GDAL库依赖的SQLite版本和你系统当前用的SQLite版本不兼容。sqlite3_column_table_name 这个函数是SQLite 3.16.0及以上版本才有的,如果你的系统SQLite版本低于这个,或者GDAL编译时用的是带这个函数的SQLite,但运行时加载了系统旧版本的,就会出这个错。
下面给你几个一步步解决的办法:
第一步:先查下系统的SQLite版本
先打开终端,跑个命令确认当前SQLite版本:
sqlite3 --version
如果输出的版本号低于3.16.0,那这就是问题的根源了,得先升级SQLite。
第二步:升级SQLite(如果版本不够)
Ubuntu旧版本默认的SQLite版本确实比较低,你可以通过第三方PPA来升级:
- 先添加PPA源:
sudo add-apt-repository ppa:jonathonf/sqlite3 sudo apt-get update
- 然后安装更新后的SQLite:
sudo apt-get install sqlite3 libsqlite3-dev
装完再跑一遍sqlite3 --version确认下,确保版本到3.16.0以上了。
第三步:让GDAL链接到新的SQLite库
要是升级后还是报错,可能是GDAL没找到新的SQLite库。先看看GDAL现在链接的是哪个SQLite:
ldd /usr/lib/libgdal.so.20 | grep sqlite
如果输出的是旧版本的路径,那可以临时设置环境变量让GDAL优先加载新库试试:
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6 # 这里替换成你实际的新SQLite库路径,可从ldd输出里找新的
然后再运行你的Django程序,要是没问题了,就把这个环境变量加到~/.bashrc或者你启动Django的脚本里,避免每次都手动输。
第四步:手动编译GDAL(前面方法都不行的话)
如果系统包管理的GDAL和SQLite实在不兼容,那就自己编译GDAL,指定用新的SQLite:
- 先装编译需要的依赖:
sudo apt-get install build-essential libproj-dev libgeos-dev libsqlite3-dev
- 下载和你当前GDAL版本匹配的源码(libgdal.so.20对应GDAL 2.4系列,比如2.4.4):
wget https://download.osgeo.org/gdal/2.4.4/gdal-2.4.4.tar.gz tar xzf gdal-2.4.4.tar.gz cd gdal-2.4.4
- 配置编译选项,指定SQLite的路径:
./configure --with-sqlite3=/usr/lib/x86_64-linux-gnu make sudo make install
- 最后更新系统库缓存:
sudo ldconfig
额外提醒
你用的Python 2.7和Django 1.11都是比较旧的版本,要注意所有依赖的版本兼容性。PostGIS 2.0.3搭配GDAL 2.4是没问题的,但编译的时候一定要确保依赖路径都对。另外如果你之前是用apt装的GDAL,最好先卸载旧版本:sudo apt-get remove libgdal-dev libgdal20,再重新弄。
内容的提问来源于stack exchange,提问作者Prashanth

