GDAL集成GEOS编译笔记

使用某些GDAL函数时报错:ERROR 6: GEOS support not enabled,查询后原因是GDAL默认编译未集成GEOS库。遂查询资料手动集成GEOS库编译GDAL,并以博客的形式记录下来。

环境:WIN7系统(x64),VS2013。

版本:GDAL-2.2.3,GEOS-3.7.1。(注:使用GDAL其他版本可能遇到诡异的错误(亲身经历。。。),当然你也可以尝试其他版本,good luck)

步骤(含32/64位,debug/release):

1.编译GEOS

(1)将GEOS源码解压至D:\tools文件夹。

若编译64位库,需打开geos-3.7.1文件夹中的nmake.opt文件,将WIN64 = NO改为WIN64 = YES;32位无需修改。

若编译Debug库,则将nmake.opt中的BUILD_DEBUG = NO改为BUILD_DEBUG = YES;Release无需修改。

(2)在程序中打开VS2013工具文件夹。

GDAL集成GEOS编译笔记

GDAL集成GEOS编译笔记

(3)打开对应版本命令提示工具(x64对应64位,x86对应32位),切换至目录D:\tools\geos-3.7.1,执行以下命令:

nmake -f makefile.vc

完成编译。生成的lib和dll文件在src文件夹下,共五个。

2.编译GDAL

(1)将GDAL压缩包解压至D:\tools文件夹。

(2)打开gdal-2.2.3文件夹中的nmake.opt文件,作以下修改:

编译64位库,将#WIN64=NO改为WIN64=YES,32位无需修改。

#GEOS_DIR=C:/warmerda/geos
#GEOS_CFLAGS = -I$(GEOS_DIR)/capi -I$(GEOS_DIR)/source/headers -DHAVE_GEOS
#GEOS_LIB     = $(GEOS_DIR)/source/geos_c_i.lib

修改为

GEOS_DIR=D:\tools\geos-3.7.1
GEOS_CFLAGS = -I$(GEOS_DIR)/capi -I$(GEOS_DIR)/include -DHAVE_GEOS
GEOS_LIB     = $(GEOS_DIR)/src/geos_c_i_d.lib

注意,geos_c_i_d.lib是debug版本的库,编译release版本时使用geos_c_i.lib。

修改结果保存文件夹GDAL_HOME = "C:\warmerda\bld"为GDAL_HOME = "D:\tools\GDAL"。

若编译报错:odbccp32.lib(dllload.obj) : error LNK2019: unresolved external symbol _vsnwprintf_s referenced in function StringCchPrintfW
gdal202.dll : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64\link.EXE"' 

可修改ODBC_SUPPORTED = 1为#ODBC_SUPPORTED = 1解决。

(3)同1(2)(3),打开对应版本命令提示符工具,切换至D:\tools\gdal-2.2.3目录下。

(4)依次执行以下命令:

nmake -f makefile.vc

nmake -f makefile.vc install

nmake -f makefile.vc devinstall

注:Debug版本第一行命令为nmake -f makefile.vc DEBUG=TRUE;

64位版本修改第二行第三行为:

nmake -f makefile.vc WIN64=TRUE install

nmake -f makefile.vc WIN64=TRUE devinstall

完成编译。

参考资料:

https://www.cnblogs.com/GIScore/p/5425206.html

https://blog.****.net/zhw_giser/article/details/47663581

https://blog.****.net/youzhuo/article/details/37930071/

https://blog.****.net/u011574296/article/details/76565703

https://blog.****.net/abc2008151521/article/details/80313904