使用MinGW源码安装PostGIS扩展失败:无法加载postgis-3.dll
针对你遇到的PostGIS扩展可见但执行CREATE EXTENSION postgis;时提示dll找不到的问题,即便文件存在且ldd检查无缺失,可从以下几个方向排查:
进程环境变量不匹配
ldd是在当前shell环境下检查依赖,但PostgreSQL服务进程的PATH可能未包含MinGW的运行时库目录(如C:\mingw64\bin)。MinGW编译的postgis-3.dll依赖的libgcc_s_seh-1.dll、libstdc++-6.dll等运行时库,若不在PostgreSQL进程的PATH中,会导致加载失败。
解决:将MinGW的bin目录添加到系统环境变量PATH中,重启PostgreSQL服务后重试。架构不匹配
确认PostgreSQL与PostGIS使用的是同架构的MinGW编译(均为32位或均为64位)。若二者架构不一致,即便dll存在,Windows也会拒绝加载。
解决:重新用相同架构的MinGW编译PostgreSQL或PostGIS,确保二者架构统一。延迟加载依赖未被检测
ldd可能无法检测到延迟加载的动态依赖,此时可通过Process Monitor追踪加载过程:- 启动Process Monitor,设置过滤条件为进程名
postgres.exe; - 执行
CREATE EXTENSION postgis;; - 查看日志中的
NAME NOT FOUND条目,定位真正缺失的依赖模块。
- 启动Process Monitor,设置过滤条件为进程名
权限与路径问题
PostgreSQL服务若以Local System账户运行,可能无权限访问用户桌面目录(你的dll路径在C:/Users/admin/Desktop/build/...)。另外,手动放置的dll可能未在PostgreSQL的扩展搜索路径内。
解决:执行make install将PostGIS文件安装到PostgreSQL默认的lib和share/extension目录,或手动复制postgis-3.dll到PostgreSQL安装目录的lib文件夹,同时确保扩展控制文件路径正确。扩展控制文件错误
检查postgis.control文件中的library字段是否指向正确路径,确认无拼写错误或路径分隔符问题(Windows下/和\均可,但需保持一致)。若控制文件路径错误,PostgreSQL会找错dll位置。
内容的提问来源于stack exchange,提问作者amerature_dev

