联合编译C++版本gdal编译过程文档
- gdal联合编译C++版本proj.4、geos、hdf4、hdf5、netcdf
- 各依赖库源代码版本及下载地址
- gdal
- Proj.4
- geos
- HDF4
- HDF5
- netCDF
- 编译环境及工具版本
- 编译安装
- 1、 编译geos
- 2、 编译proj.4
- 3、 修改gdal的编译配置文件make.opt
- 4、 编译gdal
- 编译及运行过程中可能出现的问题及对应的解决方法
- 测试gdal是否正确联合编译其他三方库的命令
- 测试hdf
- 测试proj.4
- 测试netCDF
gdal联合编译C++版本proj.4、geos、hdf4、hdf5、netcdf
各依赖库源代码版本及下载地址
gdal
版本:2.4.4
下载地址:https://gdal.org/download.html
说明:下载的是源码文件,也是本地联合编译的中心文件,其他四个三方库是融入到gdal中调用的
Proj.4
版本:4.9.3
下载地址:https://proj.org/download.html
说明:源码文件,需要使用vs进行编译,重要文件在src文件夹中
geos
版本:3.7.3
下载地址:http://download.osgeo.org/geos
说明:源码,需要使用vs进行编译,重要文件是include文件夹和src文件夹下的geos_c_i.lib文件
HDF4
版本:4.2.6
下载地址:https://support.hdfgroup.org/ftp/HDF/releases/HDF4.2.6/bin/windows/
说明:是已经编译好了的文件,也包含源码,重要文件在dll文件夹中
HDF5
版本:1.10.3
下载地址:https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.3/bin/
说明:下载的文件解压后是一个.msi文件,双击可安装,安装之后得到一个文件夹,其中的内容和HDF4中的内容相似,重要文件在bin文件夹中
netCDF
版本:4.7.2-NC4
下载地址: http://www.unidata.ucar.edu/downloads/netcdf/ftp/netCDF4.7.2-NC4-64.exe
说明:下载所得是一个.exe可执行文件,双击安装之后得到一个包含三个文件夹的文件夹,重要文件在bin当中
编译环境及工具版本
Windows x64、vs2015 x64 本机工具提示符
编译安装
注:示例文件组织模式如下:
1、 编译geos
进入geos文件夹,如果可以找到autogen.bat和makefile.vc两个文件,则证明文件夹正确,打开vs2015 x64 本机工具提示符,cd到geos文件夹,即autogen.bat和makefile.vc所在文件夹,先后运行autogen.bat和nmake /f makefile.vc src_dir
2、 编译proj.4
cd转到proj.4的文件夹,其中应该包含makefile.vc,运行nmake /f makefile.vc install-all
3、 修改gdal的编译配置文件make.opt
-
进入gdal文件夹,找到make.opt文件并使用notepad++打开,修改gdal安装路径
使用搜索工具,搜索GDAL_HOME,找到如57行的位置(不同版本位置可能会有差别),将值改为自己准备安装gdal的文件夹
-
修改编译版本为64位
搜索win64,找到如191行的位置,去掉其前面的#号(#号代表注释)
-
集成geos数据读取路径
搜索geos,找到如621~623行的位置,去掉前面的#号,将如621行GEOS_DIR的值修改为geos文件夹的路径,如geos文件夹内的内容未做修改,可将622和623行中的内容修改为截图所示
-
集成HDF4数据读取路径
搜索hdf4,找到如441~443行的位置,去掉前面的#号
将441行HDF4_DIR修改为HDF4文件夹的路径,其余内容与图上一致,442行为dll文件夹下的.lib文件列表,完整的内容为:$(HDF4_DIR)\dll\hd426m.lib $(HDF4_DIR)\dll\hm426m.lib $(HDF4_DIR)\lib\hd426.lib $(HDF4_DIR)\lib\hm426.lib Ws2_32.lib
-
集成HDF5数据读取路径
搜索hdf5,找到如451~453行的位置,去掉前面的#号
将452行HDF5_DIR的值修改为HDF5文件夹的路径,其余内容与图上一致,453行完整的内容为:$(HDF5_DIR)\lib\hdf5_cpp.lib $(HDF5_DIR)\lib\hdf5_hl.lib $(HDF5_DIR)\lib\hdf5_hl_cpp.lib $(HDF5_DIR)\lib\hdf5_tools.lib $(HDF5_DIR)\lib\libhdf5.lib $(HDF5_DIR)\lib\libhdf5_cpp.lib $(HDF5_DIR)\lib\libhdf5_hl.lib $(HDF5_DIR)\lib\libhdf5_hl_cpp.lib $(HDF5_DIR)\lib\libszip.lib $(HDF5_DIR)\lib\libzlib.lib $(HDF5_DIR)\lib\szip.lib $(HDF5_DIR)\lib\zlib.lib
-
集成netCDF数据读取路径
搜索netcdf,找到如541~545行的位置,去掉前面的#号
将544行NETCDF_LIB和545行NETCDF_INC_DIR中的D:\gdal-pgh45n替换为netcdf所在的文件夹路径,保证按照所写路径可以找到netcdf.lib和include文件夹
4、 编译gdal
将vs2015 x64 本机工具cd转到gdal文件夹,即make.opt所在文件夹,先后运行
nmake /f makefile.vc
nmake /f makefile.vc install
nmake /f makefile.vc devinstall
运行结束之后指定的安装路径下会出现如下的多个文件夹
编译及运行过程中可能出现的问题及对应的解决方法
1)、NMAKE:fatal error U1077. return code 0x460
工程中连接了一个lib文件,链接的时候却出现不能解析的外部符号。大概率是32位和64位不兼容问题,也有可能是包含的lib是错的。可以从以下几个方面检查:1、gdal的配置文件make.opt中的win64=yes是否打开以及是否将注释符号去掉;2、vs工具提示符使用的版本不对,使用其他版本的工具重试;3、参与编译的文件存在32版本
2)、NMAKE:fatal error U1077. return code 0x49d
文件路径不对,查询到文件不存在,可以返回到make.opt挨个检查文件路径是否准确,可以沿着设置的路径依次进入检查,避免漏检
3)运行安装的gdal中的bin文件夹下的.exe提示缺少某.dll文件,一般在某个依赖库的bin文件或其他文件下有该.dll文件,对于dpapi.dll的缺失可以在网上搜索下载
4)当所有的.dll都不缺失后,运行上述.exe文件提示netcdf定位H5Literate失败,这是由于netcdf中的hdf5与gdal中引用的hdf5版本冲突导致的,笔者采用的办法是寻找与netcdf中的gdf5中的一样的hdf5引入到gdal中
注:gdal运行依赖库所需的.dll文件
测试gdal是否正确联合编译其他三方库的命令
测试时采用dos命令行启动.exe读取或计算指定路径下的文件,根据运行结果及提示信息判断gdal是否正确集成对应的三方库,因此在输入测试命令前需要提前cd将当前路径转到安装的gdal的bin文件夹下
测试hdf
命令:gdalinfo.exe 目标.HDF文件
提示该.HDF文件如下图所示的各种数据信息则证明安装成功,否则安装失败
测试proj.4
命令:gdalwarp.exe" -t_srs “PROJCS[“WGS_1984_Web_Mercator_Auxiliary_Sphere”,GEOGCS[“GCS_WGS_1984”,DATUM[“D_WGS_1984”,SPHEROID[“WGS_1984”,6378137.0,298.257223563]],PRIMEM[“Greenwich”,0.0],UNIT[“Degree”,0.0174532925199433]],PROJECTION[“Mercator_Auxiliary_Sphere”],PARAMETER[“False_Easting”,0.0],PARAMETER[“False_Northing”,0.0],PARAMETER[“Central_Meridian”,0.0],PARAMETER[“Standard_Parallel_1”,0.0],PARAMETER[“Auxiliary_Sphere_Type”,0.0],UNIT[“Meter”,1.0],AUTHORITY[“Esri”,3857]]” 源tif文件 目标tif文件
测试netCDF
命令:gdalwarp.exe -t_srs “+proj=latlong +datum=WGS84” -te 112.0 28.4 116.7 32.3 -tr 0.05 0.05 -dstnodata -9999 -overwrite NETCDF:源.nc文件路径:AOT_Merged 目标.nc文件路径,如gdalwarp.exe -t_srs “+proj=latlong +datum=WGS84” -te 112.0 28.4 116.7 32.3 -tr 0.05 0.05 -dstnodata -9999 -overwrite NETCDF:F:\H08_20200727_0100_1HARP030_FLDK.02401_02401.nc:AOT_Merged F:\1.tif
错误提示:
1) 若提示ERROR 4: `NETCDF:F:\H08_20200727_0100_1HARP030_FLDK.02401_02401.nc:AOT_Merged’ does not exist in the file system, and is not recognized as a supported dataset name.说明netCDF和gdal版本不兼容,需要更换netcdf版本,笔者是由netCDF3更换为了netCDF4解决了这个问题
2) 若出现如图所示的提示
说明netCDF中的hdf5版本号是1.10.3,而gdal中的hdf5版本号是1.8.19,两者不一致,需要将gdal中的版本更换为和netCDF中的一样,即需要重新下载1.10.3版本的hdf联合编译gdal
附:
联合编译好的gdal.
单独编译好但还没做集成的文件
完全没改动过的源文件