成功编译GDAL2.1.1过程总结

如果只是为了使用GDAL,下载桌面快捷版就可以了。(参考网站:http://gmt-china.org/blog/gdal-ogr/)
如果是为了后续编译osg,则需要注意OSG和GDAL的版本对应关系,以及GDAL所能支持的最高VS版本。
笔者在Windows7 32位系统下,使用了vs2010命令提示符窗口,成功编译了gdal2.1.1。在C盘生成了三个bin,data,html文件。GDAL的编译相对要简单得多。
成功编译GDAL2.1.1过程总结_第1张图片
成功编译GDAL2.1.1过程总结_第2张图片

对于编译GDAL,有两种方法。
一、切换到gdal的目录下,打开makegdal_gen.bat,通过输入“makegdal_gen 9.00 >makegdal90.vcpro”(假如要编译vs2008版本,编译的vs版本不同输入的参数也不同),生成工程文件。之后要打开vs进行编译。
二、打开vs的工具命令提示符,切换到GDAL目录,输入“nmake -f makefile.vc install”。

对于方法一
可以看到下图:
成功编译GDAL2.1.1过程总结_第3张图片
输入“makegdal_gen.bat”,提示给出了该版本GDAL支持的vs版本,例如“makegdal_gen 10.00.64 >makegdal10.vcproj”表明支持vc2010 64位。从上可知,它不支持vs2012等更高的版本了。
对应生成的工程文件要用对应版本的VS编译器打开,笔者曾经用vs 2015 64位打开编译过makegdal_gen 9.00 >makegdal90.vcproj生成的工程文件,就爆出大量的错误。可见下图:

成功编译GDAL2.1.1过程总结_第4张图片
Vc的对应版本可以看下图:
成功编译GDAL2.1.1过程总结_第5张图片

对于方法二
同样的,要注意GDAL能支持的vs版本,选择相应的版本vs工具命令提示符窗口。笔者当时第一次编译这种复杂的,没有意识到版本匹配的重要性,直接用了电脑自带的vs 2015 64位,就出现了类似于以下的错误:
*if exist gdal.lib del gdal.lib
lib /nologo /out:gdal.lib port*.obj gcore*.obj alg*.obj frmts\o*.obj ogr\ogrsf_frmts\ogrsf_frmts.lib ogr\ogr.lib gnm*.obj gnm\gnm_frmts\o*.obj apps\commonutils.obj apps\gdalinfo_lib.obj apps\gdal_translate_lib.obj apps\gdalwarp_lib.obj apps\ogr2ogr_lib.obj apps\gdaldem_lib.obj apps\nearblack_lib.obj apps\gdal_grid_lib.obj apps\gdal_rasterize_lib.obj apps\gdalbuildvrt_lib.obj
ogrsf_frmts.lib(ogrjmllayer.obj) : warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件
ogr.lib(ograpispy.obj) : warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件
nitf_gcprpc.obj : warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因 此任何耗用此库的链接操作都不会使用此文件
cpl_recode_iconv.obj : warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件
link /nologo /dll /INCLUDE:OSRValidate /INCLUDE:OPTGetProjectionMethods /INCLUDE:OGR_G_GetPointCount /INCLUDE:OGRRegisterAll /INCLUDE:_GDALSimpleImageWarp /INCLUDE:_GDALReprojectImage /INCLUDE:_GDALComputeMedianCutPCT /INCLUDE:_GDALDitherRGB2PCT /INCLUDE:_OCTNewCoordinateTransformation port*.obj gcore*.obj alg*.obj frmts\o*.obj ogr\ogrsf_frmts\ogrsf_frmts.lib ogr\ogr.lib gnm*.obj gnm\gnm_frmts\o*.obj apps\commonutils.obj apps\gdalinfo_lib.obj apps\gdal_translate_lib.obj apps\gdalwarp_lib.obj apps\ogr2ogr_lib.obj apps\gdaldem_lib.obj apps\nearblack_lib.obj apps\gdal_grid_lib.obj apps\gdal_rasterize_lib.obj apps\gdalbuildvrt_lib.obj odbc32.lib odbccp32.lib user32.lib ws2_32.lib gcore\Version.res /out:gdal201.dll /implib:gdal_i.lib
msvcprt.lib(MSVCP140.dll) : fatal error LNK1112: 模块计算机类型“x64”与目标计算机类型“X86”冲突
NMAKE : fatal error U1077: “”D:\software\Microsoft Visual Studio 14.0\VC\BIN\amd64\link.EXE””: 返回代码“0x458”*
成功编译GDAL2.1.1过程总结_第6张图片

成功编译GDAL2.1.1过程总结_第7张图片
所以如果出现以上错误,不如看看GDAL是否支持当前的vs版本。
顺便一说,GDAL支持vs2010,并不代表编译的时候就是vs2010版本,哪怕打开了“vs2010开发命令提示”。例如下图,如果我不设置MSVC_VER的值,默认是编译vs2008(1500)的版本,只能说该版本也同样能在vs2010里使用而已。“MSVC_VER”。可以在在输入编译命令的同时设置参数“MSVC_VER”。
成功编译GDAL2.1.1过程总结_第8张图片
也有网友提出了其他可能,可以一看(参考资料4))。也有寄希望于将64位编译器切换到32位再编译的(连接http://www.cnblogs.com/flylong0204/p/4760132.html),不过笔者没成功。
此外,有一位楼主提到,他的GDAL最高支持2010,他用2012出现了编译错误,采用的方法是从其他人编译好的GDAL删除了许多不需要的driver。删除不必要的代码也是种解决方法,但是需要基础知识也有些麻烦。

还有关于32位和64位的问题。没有注意这点的可能出现错误类似于:
成功编译GDAL2.1.1过程总结_第9张图片
笔者试过使用“x64 x86兼容”“VS开发人员”等命令提示符窗口,都会出现类似错误,但是如上所述使用“vs x64”就能成功。
也有人对64位提出了输入命令时或者在nmake.opt中设置参数“WIN64=YES”的解决方案,见参考资料。不过笔者没有成功过。

补充:

在笔者编译的时候,不同版本之间会出现各种各样的问题。下面是其中一个例子。
d:\osg\gdal-2.1.2\port\cpl_port.h(128) : fatal error C1083: 无法打开包括文件:“stdio.h”: No such file or directory
NMAKE : fatal error U1077: “”C:\Program Files\Microsoft Visual Studio 11.0\VC\BIN\cl.EXE””: 返回代码“0x2”
NMAKE : fatal error U1077: “”C:\Program Files\Microsoft Visual Studio 11.0\VC\BIN\nmake.EXE””: 返回代码“0x2”
这是我使用vs2012 x86命令窗口下编译gdal-2.1.2的时候的。我看到以下方案,但是笔者没有怎么试过。
思路1:
这里写图片描述
思路2:
参考网址:http://www.qtcn.org/bbs/simple/?t56650.htm
这里写图片描述
思路3:
打开d:\osg\gdal-2.1.2\port\cpl_port.h: 在代码里确实要引用“stdio.h”。
成功编译GDAL2.1.1过程总结_第10张图片
想的是找到指定头文件的路径,再把stdio.h复制到那个目录。不过没成功。
关于cl.EXE等文件的这种错误可能是vs版本之间的差别。这些文件在C:\Program Files\Microsoft Visual Studio 12.0\VC\include里就有,但是在错误中所说Microsoft Visual Studio 11.0\VC\include下却没有,而编译时需要这些文件的。

再比如,再举个例子:
error C2143: 语法错误 : 缺少“;”(在“{”的前面)
有网友提出一种可能性:http://blog.csdn.net/lrcodeant/article/details/9998577)。

后话:
这次编译是笔者第一次,遇到了大大小小的问题,解决方法就是大量的搜索和尝试,有些成功解决了,有些不了了之。把自己的过程总结写出来,对后面的人能帮助到一点都是开心的。

参考资料:
1.《GDAL源码剖析(二)之编译说明》
http://blog.csdn.net/liminlu0314/article/details/6937194
2《vs2012下编译GDAL及建立工程》
网址:http://blog.csdn.net/efergrehbtrj/article/details/48654041
3《VS2015下编译64位GDAL总结》
http://www.cnblogs.com/charlee44/p/5718032.html
4《Windows10 + VS2015 环境下对gdal2.0.1进行64bit编译小结》
http://www.itdadao.com/articles/c15a228173p0.html

你可能感兴趣的:(gdal编译,总结)