Geos是一个GIS领域做拓扑分析的库,目前最新的版本是3.5.0,详细的介绍参考 GeosTrac
在我编译该库的过程中发现官方提供的文件有一些问题,解决之后作个记录,方便日后编译的时候查阅:
Geos从3.5.0版本开始支持使用CMake的方式进行编译,但是目前提供的CMake.txt配置有一些问题,当使用CMake生成工程的时候出现以下错误:
解决的方案参考:
cannot build geos 3.5.0
需要下载两个文件:
1.CMakeLists.txt替换原来的CMakeLists.txt
2.GenerateSourceGroups.tx将该文件的后缀名修改为.cmake,并拷贝到geos-3.5.0\cmake\modules目录下
之后重新Configure一下并Generate生成工程,使用VS打开生成好的工程,如下图所示:
工程中geos用来编译动态库geos(生成goes.lib和geos.dll),geos-static生成的是静态的geos库(生成libgeos.lib),geos_c是生成C语言的库(geos_c.lib和geos_c.dll),可以根据自己的需求编译相应的库。
编译该解决方案,发现在编译geos工程的时候报错:
这是因为工程中某个文件引入了头文件 windows.h,导致windows.h中定义的max宏与c++标准库中的std::max冲突,具体出错的位置在BufferOp.cpp文件中的第89-92行。解决的方法很简单,在std::max中加上括号,不让它进行宏替换,而是调用std::max这个函数,也就是修改为:
//原始的文件
double envMax = std::max(
std::max(fabs(env->getMaxX()), fabs(env->getMinX())),
std::max(fabs(env->getMaxY()), fabs(env->getMinY()))
);
//修改之后:
double envMax = (std::max)(
(std::max)(fabs(env->getMaxX()), fabs(env->getMinX())),
(std::max)(fabs(env->getMaxY()), fabs(env->getMinY()))
);
修改之后重新编译一下即可。
附录:我把下载的文件上传到了资源共享中,可以从里面下载: