You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Amazon Linux 2安装Spatialite遇libgdal.so: undefined symbol: sqlite3_trace_v2错误

问题:AWS Lambda Docker镜像中GeoDjango依赖Spatialite的GDAL符号错误

背景

我正在为运行Python的AWS Lambda构建包含Spatialite(用于GeoDjango)的Docker镜像。折腾GDAL安装遇到一堆问题后,发现ghcr.io/lambgeo/lambda-gdal:3.8-python3.11镜像解决了大部分问题,但还需要安装Spatialite。

当前Dockerfile配置

FROM ghcr.io/lambgeo/lambda-gdal:3.8-python3.11 as gdal

RUN yum update -y && \
    yum install -y git autoconf libtool flex bison cmake make \
      tar gzip xz gcc gcc-c++ automake16 libpng-devel nasm \
      readline-devel openssl-devel curl-devel \
      cmake3 && \
    yum clean all && \
    rm -rf /var/cache/yum /var/lib/yum/history

ENV PREFIX /opt

WORKDIR /opt

ENV LD_LIBRARY_PATH $PREFIX/lib:$LD_LIBRARY_PATH

RUN patchelf --force-rpath --set-rpath '$ORIGIN' $PREFIX/lib/libgdal.so

# pkg-config
ENV PKGCONFIG_VERSION=0.29.2
RUN mkdir /tmp/pkg-config \
  && curl -sfL https://pkg-config.freedesktop.org/releases/pkg-config-${PKGCONFIG_VERSION}.tar.gz | tar zxf - -C /tmp/pkg-config --strip-components=1 \
  && cd /tmp/pkg-config \
  && CFLAGS="-O2 -Wl,-S" ./configure --prefix=$PREFIX --with-internal-glib \
  && make -j $(nproc) --silent && make install && make clean \
  && rm -rf /tmp/pkg-config

ENV PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/

# libxml2
RUN mkdir /tmp/libxml2 \
  && curl -sfL https://download.gnome.org/sources/libxml2/2.12/libxml2-2.12.3.tar.xz | tar xJf - -C /tmp/libxml2 --strip-components=1 \
  && cd /tmp/libxml2 \
  && \
    CFLAGS='-O2 -fno-semantic-interposition' \
    PYTHON_CFLAGS='-I/var/lang/include/python3.11' \
    PKG_CONFIG_PATH='/var/lang/lib/pkgconfig/' \
    LDFLAGS='-Wl,-rpath=/var/lang/lib -L/var/lang/lib -lpython3.11' \
    ./configure --prefix=${PREFIX} \
  && make -j $(nproc) --silent && make install && make clean \
  && rm -rf /tmp/libxml2

# spatialite
RUN mkdir /tmp/spatialite \
  && curl -sfL https://www.gaia-gis.it/gaia-sins/libspatialite-sources/libspatialite-5.1.0.tar.gz | tar zxf - -C /tmp/spatialite --strip-components=1 \
  && cd /tmp/spatialite \
  && CFLAGS='-I/opt/include' LDFLAGS='-L/opt/lib' \
    ./configure --prefix=${PREFIX} \
    --enable-freexl=no --enable-minizip=no --disable-rttopo \
  && make -j $(nproc) --silent && make install && make clean \
  && rm -rf /tmp/spatialite

问题详情

因为基础镜像导出的层没有pkgconfig这类组件,我只能重复安装,还得从源码装libxml2来解决之前的一个错误。Spatialite看起来安装成功了,但运行Django应用时出现以下错误:

File "/project/.venv/lib/python3.11/site-packages/django/contrib/gis/gdal/libgdal.py", line 71, in <module>
    lgdal = CDLL(lib_path)
            ^^^^^^^^^^^^^^
  File "/var/lang/lib/python3.11/ctypes/__init__.py", line 376, in __init__
    self._handle = _dlopen(self._name, mode)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: /opt/lib/libgdal.so: undefined symbol: sqlite3_trace_v2

Django配置与环境变量

我的Django settings.py配置:

GDAL_LIBRARY_PATH = env("GDAL_LIBRARY_PATH", default="")
GEOS_LIBRARY_PATH = env("GEOS_LIBRARY_PATH", default="")
SPATIALITE_LIBRARY_PATH = env("SPATIALITE_LIBRARY_PATH", default="")

设置的环境变量:

ENV GDAL_LIBRARY_PATH=/opt/lib/libgdal.so
ENV GEOS_LIBRARY_PATH=/opt/lib/libgeos.so
ENV SPATIALITE_LIBRARY_PATH=/opt/lib/mod_spatialite.so

谷歌搜了一圈没找到解决方案,只发现一个Python问题(已在Python 3.10修复),但我用的是Python 3.11。

内容的提问来源于stack exchange,提问作者Anentropic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 05:07:34