GDAL2.0编译之添加HDF库编译C#版本

        最近一段时间想把项目软件中使用的GDAL库升级一下,由于我使用的GDAL库还是1.8版本的C#版,这个版本对文件的中文路径支持方面有些问题想换一个较高的版本进而解决该问题。

        于是从网上下载了GDAL2.01、  HDF1.8.15以及swigwin1.3.40,尝试利用HDF1.8.16与swigwin3.0.7这两个高版本的均失败了目前还没有找到什么原因,于是就换成较低的版本来进行。

       本人编译的为64位的GDAL,环境为Win10 64位、VS2015企业版,GDAL的配置关键部分如下:

!IFNDEF MSVC_VER
#assume msvc VS2008.
MSVC_VER=1900
!ENDIF

编译好的库保存路径

!IFNDEF GDAL_HOME
GDAL_HOME = "D:\lib\GDAL_HDF_x64"
!ENDIF

SWIG路径,此处为编译C#版GDAL准备

# Set the location of your SWIG installation
!IFNDEF SWIG
SWIG = D:\lib\swigwin-1.3.40\swig.exe
!ENDIF


编译64位GDAL

# Uncomment the following if you are building for 64-bit windows
# (x64). You'll need to have PATH, INCLUDE and LIB set up for 64-bit
# compiles.
WIN64=YES


配置HDF5库

# Uncomment the following and update to enable NCSA HDF Release 5 support.
HDF5_PLUGIN = NO
HDF5_DIR =	D:\lib\HDF5\1.8.15
HDF5_LIB =	$(HDF5_DIR)\lib\hdf5.lib $(HDF5_DIR)\lib\hdf5_cpp.lib

这些都修改好后启动VS2015 x64本机工具命令提示符




切换到工作目录下命令为:"D:"回车即可切换到D盘,然后利用cd命令进入工作目录即可。

下边就是编译GDAL C++版本,输入如下三行命令:

nmake -f makefile.vc

nmake -f makefile.vc install

nmake -f makefile.vc devinstall

如果在输入第一个命令出现错误,很有可能是HDF5库引起的,我在编译的过程中就出现了错误,解决办法是将HDF5的include文件夹下的H5pubconf.h文件打开,大约在195行有以下两行代码

/* Define to 1 if you have the  header file. */
#define H5_HAVE_INTTYPES_H 1


将以上两句代码中的第二行即#define这行屏蔽,因为在Windows系统中并没有inttypes这个定义,修改后代码如下

/* Define to 1 if you have the  header file. */
/*#define H5_HAVE_INTTYPES_H 1*/

然后重新输入以上三行命令进行编译,最后即可得到C++版本的GDAL,需要注意的是一定要将HDF5库中的必要的DLL拷贝到编译好的bin文件夹下,并且在调用该GDAL的时候不能仅将gdal200.dll拷贝的工程目录下,还需要将HDF5的dll拷贝到工程目录下,否则程序执行到调用GDAL库的时候会出现错误,针对我这个版本的GDAL与HDF5库,需要拷贝的DLL有如下几个:



下边就是编译C#版的GDAL,编译很简单,首先定位到gdal目录下的csharp文件夹  cd swig/csharp,然后执行以下两行命令即可

nmake -f makefile.vc interface
nmake -f makefile.vc

在李民录老师的博客中看到说第一行命令可以不执行,但是我在操作的过程中如果不执行第一步就会出错,目前还不知道什么原因,所以对于我这种情况还是需要执行第一步的。这两行命令执行完以后会在C++版本的GDAL库目录下出现csharp文件夹,该文件夹下会有8个DLL如下图所示:

GDAL2.0编译之添加HDF库编译C#版本_第1张图片


这样C#版的GDAL到此就编译完成了,但是这并不是关键所在,最关键的问题是如何调用。虽然大家常说这个问题,但是我还是犯了这个错误,导致很长一段时间不知道问题所在,在调用自己编译的C#版GDAL总是不成功。在调用C#版GDAL的时候,我不常说不要忘了把gdal200.dll拷贝到工作目录下还有相应其他的库的dll,我在调用的时候将这个八个dll以及gdal200.dll拷贝到了工作目录下,但是运行过程中出现了错误,在调用Gdal.AllRegister()这个函数时就出错了如下图所示

GDAL2.0编译之添加HDF库编译C#版本_第2张图片

后来想到是GDAL编译过程中加载了HDF5库,因此还需要将HDF5库的四个dll hdf5.dll、hdf5_cpp.dll、zlib.dll、szib.dll都拷贝到了工作目录下,再次运行错误不见了。但是当我将我的软件编译好的Release拷贝到其他人的电脑上执行的时候,GDAL又出现了错误,我就很纳闷了为什么在我的电脑上没问题,到了别人的电脑上就不行了呢。后来思考应该还是dll的问题,在我的电脑上应该已经有这个dll了,而到了其他人的电脑上,没有这个dll,因此在调用GDAL库的时候就又出现了问题,后来我开始找是哪个dll引起的,最终发现在HDF5库的bin目录下有两个dll即msvcr120.dll与msvcp120.dll,因为我下载的HDF5库是用高版本的VS编译的(大概是VS2012或者是VS2013记不清了),因此需要用到这个两个dll,因为我的电脑上已经有了这两个dll所以在我的电脑上没问题,而其他人电脑上如果没有配置这两个dll,在软件调用GDAL库的过程中就会出现问题,最后把这两个dll拷贝的工作路径下,问题得到了解决。


最终通过测试,对于我这个版本的GDAL库,在 调用C#的GDAL时需要拷贝的DLL共有如下13个dll(GDAL编译过程中添加的第三方库越多,这里需要用到的DLL也越多)

GDAL2.0编译之添加HDF库编译C#版本_第3张图片

在以后调用过程中,将这些dll拷贝到工作目录下,在工程中加载带有csharp字符的dll到引用中即可成功调用C#版的GDAL

你可能感兴趣的:(GDAL,C#,动态库编译,c#,GDAL,VS2015,GDAL编译,HDF5库)