本节书摘来自异步社区出版社《GDAL源码剖析与开发指南》一书中的第1章,第1.6节,作者:李民录 更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.6 GDAL编译
GDAL源码剖析与开发指南
GDAL的编译分为三个小节,第一节是常规编译,使用微软的Visual Studio 2008进行编译,如果用微软的其他编译器,编译过程与此类似。需要注意的是,GDAL已经不再支持Visual C++6.0编译器。第二小节主要说明怎样修改GDAL的配置文件,以使GDAL支持更多的数据格式以及算法等。第三小节对编译GDAL的64位版本进行说明。
1.6.1 常规编译
1.使用Visual Studio 2008 IDE编译
在GDAL的源代码目录中,有几个以sln为后缀的文件,比如makegdal10.sln、makegdal80.sln、makegdal71.sln、makegdal90.sln等。这些是VisualStudio的工程文件,文件名中的数字表示VS的版本号:71表示VS2003、80表示VS2005、90表示VS2008、10表示VS2010。我们根据自己电脑安装的VS版本,打开对应的文件,如图1-4所示(使用VS2008SP1版本,打开makegdal90.sln文件)。
然后我们在左侧解决方案点击右键,在弹出菜单中点击“生成”或者“重新生成”命令,GDAL就会开始编译。输出窗口中会有编译过程中的一些信息提示,直到出现生成成功等信息,就表示GDAL已经完成编译,这时在GDAL的源代码目录中会出现gdal.lib、gdal_i.lib、gdal18.dll等文件。如果没有修改GDAL中的nmake.opt文件的话,那么C盘中会出现一个名为“C:warmerdabld”的文件夹,里面包含三个文件夹,分别是bin、data和html。bin文件夹中存放的是编译出来的GDAL的可执行程序,包括GDAL提供的十几个工具集;data文件夹就是1.5.1小节中介绍的data文件夹;html文件夹中存放的是各种数据格式的说明文档。
2.使用Visual Studio 2008命令行编译
使用cmd命令行编译,首先在开始菜单中找到“所有程序→Microsoft Visual Studio 2008→Visual Studio Tools→Visual Studio 2008命令提示”,点击“Visual Studio 2008命令提示”弹出如图1-5所示的界面。
使用cd命令,切换到GDAL的源代码目录,如图1-6所示。
切换至GDAL的源代码目录后,依次敲入下面的命令行后回车,等待编译结束即可。
nmake -f makefile.vc
nmake -f makefile.vc install
nmake -f makefile.vc devinstall
同时还有其他的命令,如下所示。
nmake -f makefile.vc clean
nmake -f makefile.vcMSVC\_VER=1400 clean
nmake -f makefile.vcMSVC\_VER=1400 DEBUG = 1
以上六行的命令含义依次如下。
编译GDAL库;
编译GDAL库并安装(这里安装的意思是将生成的dll、exe等文件复制到C:warmerdabld目录);
编译GDAL库并安装开发者模式(安装的意思同上,开发者模式意思是将开发用的include文件夹中的头文件和lib文件一同复制到C:warmerdabld目录,此时会在C:warmerdabld目录中增加两个文件夹,分别是include和lib,分别存放GDAL的头文件和lib文件,用于调用GDAL库);
清理GDAL库,同时会删除编译GDAL库所生成的临时文件,作用相当于VS环境中的清理命令;
作用与第四行相同,但是添加了一个“MSVC_VER = 1400”,表示使用VS2005编译;
编译GDAL库的debug模式,可以用来调试GDAL源码。
1.6.2 自定义编译
GDAL的强大之处不单单在于可以读取栅格和矢量数据,同时还表现在以下三个方面:第一,可以进行矢量图形之间的一些常用操作,比如求交、求并、缓冲区等;第二,可以进行投影和坐标转换;第三,可以使用配置文件来对GDAL库支持的数据格式进行扩展。
如果使用GDAL默认的编译方式,那么上述的前两个功能您将不能使用,因为GDAL这两大功能是基于另外的两个开源库GEOS(Geometry Engine, Open Source)库和PROJ4库来实现的。下面对这两大库分别做一个简单的说明,讲述如何修改编译文件,让GDAL能够拥有这两大功能。
1.集成GEOS
简单来说,GEOS提供了OGC规范中简单几何要素对象操作的C++语言的实现。更详细的说明可以在GEOS的官网http://geos.osgeo.org中找到。
GEOS库提供了常用的空间操作,比如判断两个几何对象相互关系的函数Contains()、Intersects()、Touches()和Crosses()等,计算两个几何对象的空间操作的函数Difference()、Union()以及Buffer()等。
我们假设已经有编译好的GEOS库,首先使用记事本或者其他的文本编辑器打开GDAL源代码目录下的nmake.opt文件,找到“# Uncomment for GEOS support”这句(1.10版本大概在490行左右),如下面三行代码所示。
#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 = F:\Work\3rdPart\geos-3.2.2
GEOS\_CFLAGS = -I$(GEOS\_DIR)/capi -I$(GEOS\_DIR)/source/headers -DHAVE\_GEOS
GEOS\_LIB = $(GEOS\_DIR)/source/geos\_c\_i.lib
代码中F:Work3rdPartgeos-3.2.2是GEOS存放的主目录,后面两行设置的是GEOS的头文件目录和lib文件路径,设置好后保存即可。对比结果如图1-7所示。
保存完nmake.opt之后,我们按照1.6.1小节中的编译方式进行编译即可。编译后的GDAL将会支持图形之间的操作,因为函数主要是在OGR库中,后面会在OGR库中进行详细说明。编译完成后,我们需将geos_c.dll文件复制到gdal18.dll的同级目录下,否则会提示找不到geos_c.dll文件。
2.集成PROJ.4
PROJ.4是一套开源的坐标投影转换库,它可以完成在两套不同制图投影系统之间的转换,或者不同的椭球体或大地基准面之间的转换。GDAL中用到的坐标转换、投影转换、几何纠正、正射纠正等算法,都需要PROJ.4库的支持。PROJ.4的配置同GEOS库的配置方法相同,在nmake.opt文件中找到PROJ.4库的位置(1.10版本大概在429行左右),如下面的三行代码所示。
#PROJ\_FLAGS = -DPROJ\_STATIC
#PROJ\_INCLUDE = -Id:\projects\proj.4\src
#PROJ\_LIBRARY = d:\projects\proj.4\src\proj\_i.lib
我们将它们修改为以下代码。
#PROJ\_FLAGS = -DPROJ\_STATIC
PROJ\_INCLUDE = -IF:\Work\3rdPart\proj-4.7.0\src
PROJ\_LIBRARY = F:\Work\3rdPart\proj-4.7.0\src\proj\_i.lib
代码中第一行表示是否使用静态链接的方式,第二行表示PROJ.4库存放的路径,第三行为PROJ.4库的lib文件所在路径,修改后保存即可,对比结果如图1-8所示。
同GEOS库一样,保存完nmake.opt之后,我们按照第一步中的编译方式进行编译即可。编译后,我们同样将proj.dll文件复制到gdal110.dll的同级目录下,否则与坐标转换相关的所有功能都不能使用。
3.集成HDF数据读取
通过上面GEOS和PROJ库的介绍,我们对于GDAL的配置文件nmake.opt已经有了一个初步的了解。下面使用GDAL读取HDF数据也是同样,我们先在HDF的官方网上下载编译好的HDF4和HDF5的库,然后修改配置文件进行编译。HDF官网提供了32位的库和64位的库,这里我们以HDF4.2.6和HDF5-1.8.7两个库为例介绍32位库的编译,对于64位库的编译后面会进行专门介绍。
我们将下载好的HDF4.2.6和HDF5-1.8.7两个库解压,然后在nmake.opt文件中,找到HDF的位置(1.10版本大概在330行左右),代码如下。
# Uncomment the following and update to enable NCSA HDF Release 4 support.
#HDF4\_PLUGIN = NO
#HDF4\_DIR =D:\warmerda\HDF41r5
#HDF4\_LIB =/LIBPATH:$(HDF4\_DIR)\lib Ws2\_32.lib
# Uncomment the following and update to enable NCSA HDF Release 5 support.
#HDF5\_PLUGIN = NO
#HDF5\_DIR =c:\warmerda\supportlibs\hdf5\5-164-win
#HDF5\_LIB =$(HDF5\_DIR)\dll\hdf5dll.lib
我们将它们修改为下面的代码。
# Uncomment the following and update to enable NCSA HDF Release 4 support.
HDF4\_PLUGIN = NO
HDF4\_DIR =F:\Work\3rdPart\HDF4.2.6\_win\_x86
HDF4\_LIB = $(HDF4\_DIR)\dll\hd426m.lib $(HDF4\_DIR)\dll\hm426m.lib \
$(HDF4\_DIR)\lib\hd426.lib $(HDF4\_DIR)\lib\hm426.lib Ws2\_32.lib
# Uncomment the following and update to enable NCSA HDF Release 5 support.
HDF5\_PLUGIN = NO
HDF5\_DIR =F:\Work\3rdPart\HDF5-1.8.7\_win\_x86
HDF5\_LIB =$(HDF5\_DIR)\dll\hdf5dll.lib
代码修改前后的对比如图1-9所示。
保存,然后编译GDAL即可,同时我们将HDF库中的dll文件夹下的dll文件复制到gdal110.dll的同级目录下。
按照同样的方式,我们可以通过修改配置文件使GDAL支持NetCDF、Oracle等格式。
1.6.3 编译其他方面
1.makegdal_gen.bat使用
下面我们介绍怎样使用makegdal_gen.bat文件生成Visual Studio的工程文件。
首先我们打开cmd命令行窗口,使用cd命令切换到GDAL源代码目录,然后输入makegdal_gen.bat后回车,会得到该工具的一个简单实用帮助,如图1-10所示。
该工具是一个带有命令行参数的批处理工具(在后面对GDAL工具集的介绍中我们会对带有参数的命令行程序以及编写带有命令行的程序作一个详细说明),通过图1-10可以看出其基本语法如下。
makegdal\_gen 7.10 > makegdal71.vcproj
makegdal\_gen 8.00 > makegdal80.vcproj
通过上面的示例我们可以看出,该工具的命令行参数分别是:VS的版本号(具体版本号参考1.6.1小节)、一个大于号“>”、输出的VS的工程名字。如果要使用该命令行生成一个VS2008版本的工程文件,我们可以输入如下命令,回车即可。
makegdal\_gen 9.00 > makegdal90.vcproj
2.编译64位系统下的GDAL
GDAL的64位系统的编译,和32位系统的编译基本相同,首先我们在VS的工程中打开配置管理器,然后在活动解决方案平台的下拉列表中选择“新建”,然后弹出“新建解决方案平台”对话框,选择新平台为x64(需要在安装VS时安装64位的编译环境),然后点击“确定”按钮,最后在VS中选择X64进行编译即可,如图1-11所示。
使用cmd命令行编译基本同32位的一样,区别在于在开始菜单选择的不是“Visual Studio 2008命令提示”,而是“Visual Studio 2008 x64兼容工具命令提示”。
在编译开始之前,我们还需要打开nmake.opt文件,找到131行处的“#WIN64 = YES”,将前面的“#”去掉,保存,然后开始编译。如果就这样编译通过的话,那么恭喜;如果不能顺利编译过去,那么我们需要按照下面的步骤进行设置。
1)我们在GDAL目录下的nmake.opt文件中找到SYM_PREFIX的定义,应该在438行左右;
将“SYM_PREFIX = _”改为“SYM_PREFIX = ”,也就是将最后的下划线去掉。
2)在GDAL目录下的makefile.vc文件中,找到46行左右的代码,如下所示。
BASE\_INCLUDE = /INCLUDE:\_GDALSimpleImageWarp@36 \
/INCLUDE:\_GDALReprojectImage@48 \
/INCLUDE:\_GDALComputeMedianCutPCT@32 \
/INCLUDE:\_GDALDitherRGB2PCT@28 \
/INCLUDE:\_OCTNewCoordinateTransformation@8 $(VB6\_SAFEARRAYSYM)
我们需要将它修改为如下代码。
BASE\_INCLUDE = /INCLUDE:$(SYM\_PREFIX)GDALSimpleImageWarp \
/INCLUDE:$(SYM\_PREFIX)GDALReprojectImage \
/INCLUDE:$(SYM\_PREFIX)GDALComputeMedianCutPCT \
/INCLUDE:$(SYM\_PREFIX)GDALDitherRGB2PCT \
/INCLUDE:$(SYM\_PREFIX)OCTNewCoordinateTransformation $(VB6\_SAFEARRAYSYM)
修改完之后保存,然后重新编译生成GDAL即可。