添加django.contrib.gis到INSTALLED_APPS时触发OSError错误求助
解决添加
django.contrib.gis时出现的sqlite3_create_function_v2未定义符号错误 这种错误我碰到过好几次,本质上是你的系统里SQLite版本不达标,或者libspatialite依赖的SQLite版本和系统当前运行的SQLite版本不兼容导致的。sqlite3_create_function_v2是SQLite 3.7.17及以后版本才引入的函数,而你的系统要么装了更老的SQLite,要么libspatialite编译时用的是高版本SQLite,但运行时调用的却是低版本的。
下面是几个亲测有效的解决方法,按从易到难的顺序来:
方法一:直接升级系统的SQLite(Debian/Ubuntu系优先用这个)
- 先检查当前SQLite版本,确认问题根源:
sqlite3 --version - 如果输出的版本低于3.7.17,执行系统包更新:
sudo apt update sudo apt install --upgrade sqlite3 libsqlite3-dev - 安装完成后再次执行
sqlite3 --version,确认版本已经升到3.7.17以上
方法二:手动编译安装高版本SQLite(系统包升级无效时用)
有时候系统源里的SQLite版本还是不够新,这时候就得手动编译了:
- 下载最新稳定版的SQLite源码(这里以3.44.0为例,你可以换成最新版):
wget https://www.sqlite.org/2023/sqlite-autoconf-3440000.tar.gz tar xzf sqlite-autoconf-3440000.tar.gz cd sqlite-autoconf-3440000 - 编译并安装到系统全局目录:
./configure --prefix=/usr/local make sudo make install - 更新系统库缓存,让新安装的SQLite生效:
sudo ldconfig - 重新安装libspatialite,让它链接到新的SQLite:
sudo apt remove libspatialite7 libspatialite-dev sudo apt install libspatialite7 libspatialite-dev
方法三:在虚拟环境中指定SQLite库路径(不想修改全局时用)
如果不想改动系统全局的SQLite,可以在虚拟环境里做局部配置:
- 激活你的Django虚拟环境后,设置环境变量让Python优先使用高版本的SQLite:
export LD_PRELOAD=/usr/local/lib/libsqlite3.so - 你也可以把这条命令加到虚拟环境的
activate脚本末尾,这样每次激活虚拟环境时都会自动生效。
验证修复效果
完成上面任意一种方法后,建议先验证SQLite版本是否达标:
打开Python shell,执行以下代码:
import sqlite3 print(sqlite3.sqlite_version)
只要输出的版本≥3.7.17,再启动你的Django项目,应该就不会再出现那个未定义符号的错误了。
内容的提问来源于stack exchange,提问作者Goodness Ezeokafor
相关产品推荐
相关产品推荐

