VS2019C++编译GDAL3.3.2+SQLite3+PROJ6+GEOS3.7.3+HDF4+HDF5(保姆级教程)

VS2019C++编译GDAL3.3.2+SQLite3+PROJ6+GEOS3.7.3+HDF4+HDF5

前言:

本篇为VS2019配置GDAL3.3.2+SQLite3+PROJ6+GEOS3.7.3+HDF4+HDF5的过程!

本篇为基于VS2019(MSVC),编译X64的Debug版本的静态库GDAL,其他版本会在中间注释。

1、准备

GDAL3.0以上编译要求PROJ6投影库,而PROJ6又要求SQLite3环境,所以编译GDAL之前我们需要编译好SQLite3PROJ6

GDAL本身没有自带HDF库,如果需要读取HDF4/5数据的话还需要集成GEOS库和HDF4/5库。

1.1下载

1.1.1下载库

(a,b,c必备,d,e,f可选)

注意:如果要配置GEOS,HDF4,HDF5,编译GDAL之前先配置这三个库,配置完再编译!

a. GDAL官方下载地址为GDAL官网,我下载的版本是gdal-3.3.2;
b. PROJ6的官方下载地址为PROJ官网,我现在的版本为6.3.2版本;
c. SQLite3的官方下载地址为SQLite官网,下载Source Code下的sqlite-amalgamation-3360000.zip,和Precompiled Binaries for Windows下的sqlite-dll-win64-x64-3360000.zip(如果要配置32位GDAL,则下载sqlite-dll-win32-x86-3360000.zip), sqlite-tools-win32-x86-3360000.zip

为了方便编译,我将下载的三个文件分别解压在F盘的GDALTools目录下GDAL、PROJ、SQLite文件夹内,以备后用。

d. GEOS下载,地址GEOS官网,我下的geos-3.7.3,后面需要编译;
e. HDF4库下载,HDF4.2.6下载地址HDF4.2.6_win_x64.zip(如果要配置32位GDAL,则下载HDF4.2.6_win_x86.zip);
f. HDF5库下载,HDF5-1.8.7下载地址HDF5-1.8.7_win_x64.zip(如果要配置32位GDAL,则下载 HDF5-1.8.7_win_x86.zip);
e和f下载的就是编译好的,将下载的GEOS、HDF4、HDF5分别解压编译GDAL所需库和工具目录(我的是F:\GDALTools)下的supportlibs文件夹下,方便后面配置。

1.1.2工具下载

cmake官方下载地址为CMake官网,下载cmake-3.18.0-rc4-win64-x64.msi(编译32位GDAL则下载cmake-3.18.0-rc2-win32-x86.msi,其实不太影响,32位的GDAL必须一套32位,强迫症罢了!)文件直接在windows上安装,安装过程中选择Add CMake to the system PATH for all users或者Add CMake to the system PATH for the current users为所有用户或者只为当前用户配置环境变量,以便在cmd命令行中使用。

安装完后win + R 输入 cmd 打开命令行,在命令行中输入cmake -version查看cmake是否安装成功,出现以下内容即为安装成功!
请添加图片描述

2、编译

2.1 静态编译SQLite库

2.1.1 解压

将下载好的两个文件sqlite-amalgamation-3360000.zip、和sqlite-dll-win64-x64-3360000.zip解压到SQLite文件夹内,如下所示:

F:\GDALTools\SQLite
├─sqlite-amalgamation-3360000
│      shell.c
│      sqlite3.c
│      sqlite3.h
│      sqlite3ext.h
│
└─sqlite-dll-win64-x64-3360000
        sqlite3.def
        sqlite3.dll
2.1.2 创建静态库工程
  • 在SQLite目录下创建一个新工程
    请添加图片描述
    请添加图片描述
    请添加图片描述

  • 选好工程创建位置之后,将sqlite3.csqlite3.hsqlite3ext.hsqlite3.def四个文件添加到工程中,如下图所示:
    请添加图片描述
    请添加图片描述

  • 右键点击项目名称,选择属性打开属性框:
    请添加图片描述

  • 配置选择所有配置,平台选择所有平台,配置类型选择静态库(.lib)(如果要配置动态库,则选择

    动态库(.dll)
    请添加图片描述

  • 点击C/C++,选择预处理器,点击预处理器定义进行编辑

    VS项目目录下一定要有文件,这样属性框才会显示C/C++选项
    请添加图片描述

  • 将以下内容添加到预定义处理里面

    _USRDLL
    SQLITE_ENABLE_RTREE
    SQLITE_ENABLE_COLUMN_METADATA
    SQLITE_ENABLE_FTS5
    SQLITE_ENABLE_UNLOCK_NOTIFY
    

    请添加图片描述

  • 设置模块定义文件,链接器 --> 输入 --> 模块定义文件 --> 编辑
    请添加图片描述

  • 最后点击属性框的应用,再点击确定
    请添加图片描述

  • 修改模块定义文件sqlite3.def,在最后追加sqlite3_unlock_notify
    请添加图片描述

  • 修改编译器配置类型为Debug,X64

    编译64位Debug版GDAL选择 Debug,X64

    编译32位Debug版GDAL选择 Debug,X86

    编译64位Release版GDAL选择 Release,X64

    编译32位Release版GDAL选择 Release,X86

    请添加图片描述

  • 最后生成解决方案
    请添加图片描述

  • F:\GDALTools\SQLite\SQLite3\x64\Debug(你的项目目录下)文件夹可以看到SQLite3.lib静态库(Release版在F:\GDALTools\SQLite\SQLite3\x64\Release文件夹中)。

  • 在SQLite目录中分别创建include和lib和bin文件夹,将刚才生成的SQLite3.lib文件放入lib文件夹中,将sqlite-amalgamation-3360000中的sqlite3.hsqlite3ext.h放入include中,将sqlite-tools-win32-x86-3360000中的sqlite3.exe放在bin文件夹中以备后用。

2.2、编译PROJ6

2.2.1 解压
  • 将下载好的proj-6.3.2.tar.gz解压到PROJ文件夹中。
2.2.2 编译PROJ6
  • 进入库文件夹中,在源码目录中创建build文件夹,打开cmake。
    请添加图片描述

  • Where is the source code 选择proj库文件夹所在路径,Where to build the binaries选择你刚在所创建的build目录所在路径
    请添加图片描述

  • 点击左下角的Configure,选择 Visual Studio 16 2019x64(编译32位则选择X86),然后点击Finish。
    请添加图片描述

  • 点击完Finish他会开始进行安装,会出现一些错误,如图:
    请添加图片描述
    这时找到NameEXE_SQLITE3SQLITE3_INCLUDE_DIRSQLITE3_LIBRARY三个属性,可以看到现在它们的Value值都为NOTFOUND或者其他路径的状态,这并不相符合,我们将SQLite3.exeincludeSQLite3.lib的路径分别赋给它们,并找到Name为CMAKE_INSTALL_PREFIX的属性设置文件生成目录,我设置的是F:\GDALTools\PROJ\OSGeo4W
    请添加图片描述

  • 重新点击Configure,提示Configuring done。点击Generate,提示Generating done。这时可以看到build文件夹里有PROJ4.sln。
    请添加图片描述

  • 打开x64 Native Tools Command Prompt for VS 2019(一般在开始菜单安装VS2019的文件夹里就能看到),进入build文件夹。
    请添加图片描述

  • 然后输入命令:

    msbuild ALL_BUILD.vcxproj /p:Configuration="Debug"
    msbuild INSTALL.vcxproj /p:Configuration="Debug"
    

    进行编译
    第一行命令结果:
    请添加图片描述
    警告不影响,如果想消除警告,进入到..\PROJ\proj-6.3.2\src\transformationsdeformation.cpphelmert.cpp用VS高级保存选项保存成Unicode - 代码页 1200编码,然后再重新编译

    如果没有"高级保存选项"请参考这篇文章

    第二行命令结果:
    请添加图片描述

  • 这时可以在设置的文件生成目录中找到生成的文件
    请添加图片描述
    bin中有各种*.exe文件、 include中放有头文件、 lib 中是静态库文件、share放有一些数据文件。到此PROJ编译完成。

2.3 编译GEOS库

2.3.1 修改nmake.opt文件
  • 首先进入GEOS源码文件夹中的,修改nmake.opt文件

  • 26行的BUILD_DEBUG =设置成YES(如果是Release版,设置为NO)

  • 56行的WIN64=设置成YES(如果是编译32位,设置为NO)

  • 166和167行的GEOS_MSVCGEOS_MSC 分别按照自己的MSVC版本修改

    • GEOS_MSVC 可以通过查看VS安装目录下的VC\Tools\MSVC看到xx.xx.xxxxx文件夹,从左往右数第二个小数点前面的就是GEOS_MSVC,比如我的是VS2019版本号16.11.3,对应的就是GEOS_MSVC就是14.29。

    • GEO_MSC可以通过在VS下输入代码_MSC_VER,鼠标悬浮在上方看到,比如我的GEO_MSC就是1929,

      如图:
      请添加图片描述

2.3.2 进行编译GEOS库
  • 管理员运行x64 Native Tools Command Prompt for VS 2019(在开始菜单中)(编译32位则选择x86 Native Tools Command Prompt for VS 2019),cd进入GEOS文件夹下,输入以下命令:

    autogen.bat
    nmake -f makefile.vc
    

    请添加图片描述
    请添加图片描述
    没有报错说明编译成功!

  • 可以看到GEOS源码目录下的src文件夹中生成的.lib和.dll文件,一共5个。
    请添加图片描述

2.4 编译GDAL库

2.4.1 解压
  • 将下载好的GDAL3.3.2解压到GDAL文件夹内。
2.4.2 修改nmake.opt文件

进入GDAL源码文件夹中,找到nmake.opt文件打开。

  • 42行左右的MSVC_VER=设置为1929,具体数字根据自己的MSVC版本设置;

  • 66行左右的GDAL_HOME =设置成想要的位置,我设置成F:\GDALAllVersions\GDAL_Static_MSVC_Debug_X64

  • 130行左右的DEBUG=0改为DEBUG=1;(如果是Release版,设置为0)

  • 213行左右的#WIN64=YES去掉#号注释,变为WIN64=YES;(如果是编译32位,设置为NO)

  • 240行左右的DLLBUILD=1改为DLLBUILD=01启动动态编译、 0为静态编译。我这里进行静态编译设置DLLBUILD=0

  • 260行和264行左右找到PROJ_INCLUDE PROJ_LIBRARY,分别设置成你刚才生成PROJ时的includelib文件夹(其中PROJ_INCLUDE-I后为地址),并将.lib的名称改对,最后去掉#号注释。

    # PROJ stuff (required dependency: PROJ >= 6)
    PROJ_INCLUDE = -IF:\GDALTools\PROJ\OSGeo4W\include
    # Note: add shell32.lib is needed starting with PROJ 7.0 in some circumstances
    # for static linking. See https://github.com/OSGeo/gdal/issues/2488
    # And ole32.lib also since PROJ 7.1 (see https://github.com/OSGeo/gdal/issues/2743)
    PROJ_LIBRARY = F:\GDALTools\PROJ\OSGeo4W\lib\proj_d.lib
    
  • 650行和651行左右,找到SQLITE_INCSQLITE_LIB分别设置成你刚才创建在SQLite文件夹里的includelib文件夹(其中SQLITE_INC-I后为地址),并将.lib的名称改对,最后去掉#号注释。

    # SQLite Libraries
    SQLITE_INC=-IF:\GDALTools\SQLite\include
    SQLITE_LIB=F:\GDALTools\SQLite\lib\SQLite3.lib
    
  • 753行,754行,755行左右找到GEOS_DIRGEOS_CFLAGSGEOS_LIB

    #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:\GDALTools\supportlibs\geos-3.7.3
    GEOS_CFLAGS = -I$(GEOS_DIR)/capi -I$(GEOS_DIR)/include -DHAVE_GEOS
    GEOS_LIB     = $(GEOS_DIR)/src/geos_c_i_d.lib
    

    注意,geos_c_i_d.lib是debug版本的库,编译release版本时使用geos_c_i.lib

  • 581行左右,找到HDF4_PLUGINHDF4_DIRHDF4_LIBHDF4_INCLUDE

    #HDF4_PLUGIN = NO
    #HDF4_DIR =	D:\warmerda\HDF41r5
    #HDF4_LIB =	/LIBPATH:$(HDF4_DIR)\lib Ws2_32.lib
    #HDF4_INCLUDE = $(HDF4_DIR)\include
    

    将其修改为:

    HDF4_PLUGIN = NO
    HDF4_DIR =	F:\GDALTools\supportlibs\HDF4.2.6_win_x64
    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
    HDF4_INCLUDE = $(HDF4_DIR)\include
    
  • 593行左右,找到HDF5_PLUGINHDF5_DIRHDF5_LIB

    #HDF5_PLUGIN = NO
    #HDF5_DIR =	c:\warmerda\supportlibs\hdf5\5-164-win
    #HDF5_LIB =	$(HDF5_DIR)\dll\hdf5dll.lib
    

    将其修改为:

    HDF5_PLUGIN = NO
    HDF5_DIR =	F:\GDALTools\supportlibs\HDF5-1.8.7_win_x64
    HDF5_LIB =	$(HDF5_DIR)\dll\hdf5dll.lib
    

至此,GDAL的namke.opt文件修改完毕,保存文件!

2.4.3 编译GDAL
  • 打开x64 Native Tools Command Prompt for VS 2019(编译32位则选择x86 Native Tools Command Prompt for VS 2019),进入GDAL文件夹下,运行以下三行命令:

    nmake /f makefile.vc
    nmake /f makefile.vc install
    nmake /f makefile.vc devinstall
    

    第一行命令结果:
    请添加图片描述
    第二行命令结果:
    请添加图片描述
    第三行命令结果:
    请添加图片描述

  • 最后,记得将hdf4hdf5库中的dll文件夹下的.dll文件(总共18个,因为重复2个,所以加进去为16个)、GEOS库文件夹下src文件夹中geos_c_d.dll文件,都拷贝到GDAL编译后存放的目录下的bin文件夹下,否则会提示你找不到xxx.dll文件。

3、设置环境变量

3.1 设置GDAL环境变量

右键 此电脑 --> 属性 --> 高级系统设置 --> 环境变量 --> 找到下面系统变量里面的Path,双击 --> 将编译好的GDALbin文件夹路径添加到里面。比如我的路径是F:\GDALAllVersions\GDAL_Static_MSVC_Debug_X64\bin

3.2 设置PROJ环境变量

将生成的OSGeo4W文件夹下的share文件夹下的proj文件夹路径添加到Path

比如我的路径是F:\GDALTools\PROJ\OSGeo4W\share\proj

3.3 重启电脑生效

请添加图片描述
至此,GDAL3.3.2+SQLite3+PROJ6+GEOS3.7.3+HDF4+HDF5 编译完成!

4、进行GDAL测试

4.1创建VS空项目

  • 创建VS空项目如下:
    请添加图片描述

4.2 配置GDAL库

  • 首先创建一个main.cpp,使项目属性具有C/C++选项。

  • 右键 项目–> 属性 --> C/C++ --> 附加包含目录–>添加所编译的GDALinclude文件夹路径
    请添加图片描述

  • 点击链接器-附加库目录-编辑添加GDALlib文件夹路径
    请添加图片描述

  • 点击链接器-输入-附加依赖项-编辑添加gdal.lib,点击应用-确定。
    请添加图片描述

  • 选择配置Debug平台x64(选择你所编译的版本配置平台)即可运行程序。请添加图片描述

4.3 进行GDAL库测试

  • 在项目中创建GetRasterInformation.h头文件和GetRasterInformation.cpp源文件

  • 创建main.cpp主文件

    • GetRasterInformation.h声明函数

      /**
      * GetRasterInformation.h声明函数
      */
      
      #pragma once
      #include "gdal_priv.h"
      #include <iostream>
      using namespace std;
      
      /**
      * 获取图像信息
      */
      void GetRasterInformation(const char* file);
      
    • GetRasterInformation.cpp定义函数

      #include "GetRasterInformation.h"
      
      void GetRasterInformation(const char* file)
      {
          //注册文件格式
          GDALAllRegister();
      
          //使用只读方式打开图像
          GDALDataset* poDataset = (GDALDataset*)GDALOpen(file, GA_ReadOnly);
          if (poDataset == NULL)
          {
              cout << "File:" << "E:\\DataSet\\test.tif" << "不能打开!"<<endl;
              return;
          }
      
          //输出图像格式信息
          cout << "Driver: " << poDataset->GetDriver()->GetDescription()
              << "/" << poDataset->GetDriver()->GetMetadataItem(GDAL_DMD_LONGNAME)
              << endl;
      
          //输出图像的大小和波段个数
          cout << "Size is " << poDataset->GetRasterXSize()
              << "x" << poDataset->GetRasterYSize()
              << "x" << poDataset->GetRasterCount()
              << endl;
      
          //输出图像的投影信息
          if (poDataset->GetProjectionRef() != NULL)
          {
              cout << "Projection is " << poDataset->GetProjectionRef() << endl;
          }
      
          //输出图像的坐标和分辨率信息
          double adfGeoTransform[6];
          if (poDataset->GetGeoTransform(adfGeoTransform) == CE_None)
          {
              printf("Origin = (%.6f,%.6f)\n", adfGeoTransform[0], adfGeoTransform[3]);
              printf("PixelSize = (%.6f,%.6f)\n", adfGeoTransform[1], adfGeoTransform[5]);
          }
      
          //读取第一个波段
          GDALRasterBand* poBand = poDataset->GetRasterBand(1);
          GDALDataType type = poBand->GetRasterDataType();//获取数据类型
          cout << "第一个波段的数据类型为:" << GDALGetDataTypeName(type) << endl;
          //获取该波段的最大值最小值,如果获取失败,则进行统计
          int bGotMin, bGotMax;
          double adfMinMax[2];
          adfMinMax[0] = poBand->GetMinimum(&bGotMin);
          adfMinMax[1] = poBand->GetMaximum(&bGotMax);
      
          if (!(bGotMin && bGotMax))
          {
              GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);
          }
      
          printf("Min = %.3fd , Max = %.3f\n", adfMinMax[0], adfMinMax[1]);
      
          //关闭文件
          GDALClose(poDataset);
      }
      
    • main.cpp主函数

      #include "GetRasterInformation.h"
      
      int main()
      {
          const char* inFile = "E:\\DataSet\\RGB.tif";
      
          GetRasterInformation(inFile);
      
          system("pause");
      
          return 0;
      }
      
  • 运行结果
    请添加图片描述
    运行成功,GDAL编译成功且测试成功,完结散花!

5、致谢

非常感谢这些大神的帮助!!!
排名不分先后,皆为大神!!!

  1. 大神1
  2. 大神2
  3. 大神3
  4. 大神4
  5. 大神5
  6. 大神6
  7. 大神7
  8. 大神8
  • 11
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值