spatialie运行出错的解决办法

如果程序链接到spatialite出现以下错误:

lt-demo2: geos_ts_c.cpp:3657: int GEOSCoordSeq_setOrdinate_r(GEOSContextHandle_t, geos::geom::CoordinateSequence*, unsigned int, unsigned int, double): Assertion `0 != cs' failed.
[1]    15401 abort (core dumped)  ./demo2

十有八九是因为spatialite依赖的库GEOS多线程出问题了,我碰到的情况是GEOS 3.5.0 + spatialite 4.3.0a。解决办法是下载spatialite 4.4.0-RC1的源码,用以下命令重新编译:

./configure --prefix=/usr --enable-libxml2  CPPFLAGS="$CPPFLAGS -DGEOS_USE_ONLY_R_API"

因为GEOS库几乎所有函数都有两个版本:非线程安全(不带'_r',比较老)和线程安全(带'_r')的版本。新版spatialite(4.4.0-RC1)编译也必须加上CPPFLAGS="$CPPFLAGS -DGEOS_USE_ONLY_R_API"这个选项才会调用线程安全的版本。

该问题我在macOS Homebrew和Archlinux官方源安装的版本里都遇到了,是个埋藏很深的雷。写在这里希望对后来者有所帮助。

ref: https://groups.google.com/forum/?hl=en&fromgroups=#!topic/spatialite-users/9-32tVQ-720

posted on 2016-10-06 06:22  victl  阅读(356)  评论(0编辑  收藏  举报

导航