如果程序链接到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
时间: 2024-10-15 16:21:54