Win64下编译集成GEOS和Proj4的GDAL
1.编译GEOS
可参看我的这篇文档 VS2015编译GEOS的debug和release版本。
2.编译Proj4
现在最新的proj5.2.0已经可以通过cmake进行编译了,尝试了一下确实比以前要方便点。解压下载的proj5.2.0的压缩包,在cmake界面填入如下路径:
点击“configure”,选择合适的编译器,就会出现上图的配置选项。这里注意BUILD_LIBPROJ_SHARED和BUILD_SHARED_LIBS这两个选项默认是没有勾选的,如果直接编译,之后得到的就会是静态库。由于我需要动态库,这里就都勾选了(两者分别勾选的具体含义还需要进一步确认)。此外,CMAKE_INSTALL_PREFIX这个配置项也要注意。cmake得到的工程都有install工程,生成之后就会自动把需要的头文件、lib还有dll复制到对应的目录中去,这样方便我们管理。
之后点击“Generate”,之前设置的build目录中就生成了VS的工程。
用VS打开工程,生成解决方案,等待编译完成。有的VS项目互相依赖,可能需要多生成几次。最后,生成一次INSTALL项目,之前CMAKE_INSTALL_PREFIX设置的目录就会有相应的头文件、dll、lib以及依赖。
3.GDAL集成Proj4和GEOS
我这里编译的是GDAL的2.3.3版本。解压出gdal-2.3.3目录,找到目录中的nmake.opt,里面记录着相关的编译设置。用记事本打开,修改相应的配置。以下#号注释表示之前的配置,不带#号的表示修改之后的。
1) 修改安装的目录
#GDAL_HOME = "C:\warmerda\bld"
GDAL_HOME = "D:\Work\GDALBuild\gdal-2.3.3\result"
将GDAL_HOME修改为自己想要的目录。在编译和安装指令完成之后,就会把GDAL的所有的精简依赖发送到这个目录中。
2) 配置Proj4
# PROJ stuff
# Uncomment the following lines to link PROJ library statically. Otherwise
# it will be linked dynamically during runtime.
# To use the new API of proj5 or later, use
#PROJ_FLAGS = -DPROJ_STATIC -DPROJ_VERSION=5
# for proj 4.x:
#PROJ_FLAGS = -DPROJ_STATIC -DPROJ_VERSION=4
#PROJ_INCLUDE = -Id:\projects\proj.4\src
PROJ_INCLUDE = -ID:\Work\GDALBuild\proj-5.2.0\src
#PROJ_LIBRARY = d:\projects\proj.4\src\proj_i.lib
!IFDEF DEBUG
PROJ_LIBRARY = D:\Work\GDALBuild\proj-5.2.0\result\x64_debug\local\lib\proj_5_2_d.lib
!ELSE
PROJ_LIBRARY = D:\Work\GDALBuild\proj-5.2.0\result\x64_release\local\lib\proj_5_2.lib
!ENDIF
根据注释,PROJ_FLAGS是静态编译的时候才需要开启的,而刚才我们编译的Proj4编译的是动态库,所以不用管这个配置项目。PROJ_INCLUDE是需要的头文件,根据实例引用到proj的src目录即可。PROJ_LIBRARY表示需要的lib,这里根据是否debug模式,引入刚才编译的不同的.lib。
3) 配置GEOS
# Uncomment for GEOS support (GEOS >= 3.1.0 required)
#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:/Work/GDALBuild/geos-3.7.1
GEOS_CFLAGS = -I$(GEOS_DIR)/capi -I$(GEOS_DIR)/include -DHAVE_GEOS
!IFDEF DEBUG
GEOS_LIB = $(GEOS_DIR)/geos_build/x64_debug/geos_c_i_d.lib
!ELSE
GEOS_LIB = $(GEOS_DIR)/geos_build/x64_release/geos_c_i.lib
!ENDIF
这段配置的意思是设置GEOS_DIR为GEOS的根目录,GEOS_CFLAGS引用到根目录下的capi文件夹和include文件夹作为编译需要的头文件,根据是否是debug模式,设置GEOS_LIB为对应的lib。
4) 自定义动态库名称(可跳过)
#GDAL_DLL = gdal$(VERSION).dll
!IFDEF DEBUG
GDAL_DLL = gdal$(VERSION)D_CL.dll
!ELSE
GDAL_DLL = gdal$(VERSION)_CL.dll
!ENDIF
根据这篇文章《自定义编译gdal库》,可以将生成DLL、lib根据是否debug模式改成不同的名称。尝试过多次,修改dll名称是可以的,修改lib名称存在问题。
5) 编译
在安装VS2015环境后的“开始菜单”中找到“VS2015x64本机工具命令提示符”并启用。CD到gdal-2.3.3目录,依次输入以下指令(debug模式):
nmake -f makefile.vc MSVC_VER=1900 WIN64=1 DEBUG=1 ANALYZE=1 WITH_PDB=1
nmake -f makefile.vc MSVC_VER=1900 WIN64=1 DEBUG=1 ANALYZE=1 WITH_PDB=1 install
nmake -f makefile.vc MSVC_VER=1900 WIN64=1 DEBUG=1 ANALYZE=1 WITH_PDB=1 devinstall
第一个指令表示编译,时间较长。第二个第三个指令表示安装,会把GDAL的依赖复制到GDAL_HOME制定的的文件夹。如果需要release模式,则输入以下指令:
nmake -f makefile.vc MSVC_VER=1900 WIN64=1
nmake -f makefile.vc MSVC_VER=1900 WIN64=1 install
nmake -f makefile.vc MSVC_VER=1900 WIN64=1 devinstall
最后输出的结果: