注册

【求助】DM8 空间扩展 SP_INIT_GEO_SYS 报错"加载第三方库[libgeos_c.dll]失败,库文件缺失或版本太旧"

洋🐑 2026/08/05 404 3

【求助】DM8 空间扩展 SP_INIT_GEO_SYS 报错"加载第三方库[libgeos_c.dll]失败,库文件缺失或版本太旧"

环境信息

项目 信息
数据库版本 DM8 开发版(安装包:dm8_20260709_x86_win_64)
操作系统 Windows 10/11 64位
实例端口 5236
安装路径 D:\Dameng
连接账号 SYSDBA

问题描述

在执行空间扩展初始化时,调用 SP_INIT_GEO_SYS(1) 失败,错误信息:

[-2870]:加载第三方库[libgeos_c.dll]失败,库文件缺失或版本太旧

导致无法使用 GEOMETRY 类型、ST_GEOMFROMTEXT() 等空间函数,业务系统中所有含空间字段的表(如行政区划边界、应急避难场所位置等)均无法创建。

错误复现步骤

-- 1. 检查空间扩展状态 SELECT SF_CHECK_GEO_SYS AS GEO_STATUS; -- 返回 0,未启用 -- 2. 初始化空间扩展 CALL SP_INIT_GEO_SYS(1); -- 报错:[-2870]:加载第三方库[libgeos_c.dll]失败,库文件缺失或版本太旧 -- 3. 尝试创建含 GEOMETRY 类型的表 CREATE TABLE TEST_GEOM (ID INT, GEOM GEOMETRY); -- 报错:GEOMETRY 类型未识别

已做的排查工作

1. 确认安装包自带 GEOS 库版本

D:\Dameng\bin\geos_c.dll 进行二进制字符串分析,提取出版本信息:

当前版本:3.10.3-CAPI-1.16.1

2. 分析达梦 dmspatial.dll 期望的 GEOS 版本

D:\Dameng\bin\dmspatial.dll 进行二进制字符串分析,发现其中包含版本校验字符串:

"GEOS Library version %s is not match %s"
"3.12.1"
"3.14.1"

结论dmspatial.dll 编译时绑定的 GEOS 版本为 3.12.1 或 3.14.1,但安装包自带的 geos_c.dll 版本为 3.10.3,存在版本不匹配问题。

3. 尝试替换为官方 GEOS 3.14.1 预编译库

  • 从 OSGeo4W 官方源下载 geos-3.14.1-1.tar.bz2(x86_64)
  • 解压得到 geos_c.dll(版本:3.14.1-CAPI-1.20.5)和 geos.dll
  • 验证 DLL 架构为 x64,与 dmspatial.dll 匹配
  • 备份原文件后替换 D:\Dameng\bin 下的:
    • geos_c.dll
    • libgeos_c.dll(由 geos_c.dll 复制并重命名)
    • geos.dll
    • geos.3.10.dll
  • 额外将上述 DLL 复制到 C:\Windows\System32
  • 重启达梦数据库服务多次

结果:在 PowerShell 中通过 P/Invoke 方式调用 libgeos_c.dll 中的 GEOSversion()GEOS_init_r()GEOS_finish_r() 函数均能正常工作,但达梦数据库执行 SP_INIT_GEO_SYS(1) 仍报相同错误。

4. 其他已排除的因素

  • ✅ DLL 文件存在且可访问
  • ✅ DLL 架构(x64)匹配
  • ✅ DLL 依赖项(MSVCP140、VCRUNTIME140、VCRUNTIME140_1)齐全
  • ✅ 达梦服务进程工作目录为 D:\Dameng\bin
  • ✅ 系统 PATH 包含 D:\Dameng\bin
  • ✅ DLL 已复制到 System32
  • ✅ 达梦服务已重启多次

推测原因

达梦 SP_INIT_GEO_SYS 内部可能存在以下机制之一,导致第三方编译的 GEOS 库无法通过验证:

  1. 数字签名校验:达梦可能对 libgeos_c.dll 进行签名验证,第三方编译的库无达梦签名
  2. 编译选项校验:达梦可能校验 GEOS 库的特定编译选项或 ABI 兼容性标识
  3. 内部版本指纹:除 CAPI 版本号外,可能还有内部指纹校验

需求说明

我的业务系统(雨花区易渍涝点防汛排涝智慧平台)需要在达梦数据库中存储行政区划边界、应急避难场所位置、撤离路线等空间数据,使用 GEOMETRY 类型并以 SRID 4490(CGCS2000)坐标系存储,依赖以下空间函数:

  • ST_GEOMFROMTEXT() - 将 WKT 转换为空间对象
  • ST_ASTEXT() - 将空间对象转换为 WKT
  • ST_SRID() - 获取空间参考
  • 空间索引(CREATE SPATIAL INDEX

期望达梦官方提供

  1. 匹配版本的 GEOS 库:与 dm8_20260709_x86_win_64 安装包中 dmspatial.dll 兼容的 libgeos_c.dllgeos_c.dllgeos.dll(版本 3.12.1 或 3.14.1)
  2. 或提供修复方案:如有其他配置项或补丁包能解决此问题,请告知具体操作步骤

联系方式

如有需要进一步沟通,可通过以下方式联系:

  • 邮箱:[您的邮箱]
  • 电话:[您的电话]

附件:

  1. dmspatial.dll 中的版本校验字符串截图
  2. geos_c.dll 版本信息截图
  3. 错误信息截图

请达梦官方或社区专家协助解决,感谢!

回答 0
暂无回答
扫一扫
联系客服