【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  转载请注明原文地址:https://www.cnblogs.com/litou/p/15004877.html

 

目录
一、介绍
二、编译准备
三、编译SQLite
四、编译LibTiff
五、编译PROJ
六、编译GDAL
七、编译C#接口
八、编译结果
九、C#调用测试

 

  一、介绍

  GDAL是一个开源的栅格和矢量空间数据操作库。它使用单一的抽象数据模型和驱动模式,支持大多数的栅格和矢量空间数据的操作,从而不再依赖固定的类库(如ArcEngine等)。

  官网:https://gdal.org

  GitHub:https://github.com/OSGeo/gdal

  GDAL只提供了源码下载,已编译的版本可以在https://www.gisinternals.com下载,但是该网站提供的已编译版本中包含了MapServer等其他内容,导致库总文件多(330个)且体积大(共约120M),不利于发布和使用。要想达到精简的目的,只能自行编译。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

 

  二、编译准备

  GDAL是基于C++编写的,故编译需要一定的依赖库。依赖关系如下(来自于各库网站的requirement):

  1)GDAL最新版3.3.1:依赖PROJ >= 6;依赖VC++ >= 1900(即>=2015)

  2)PROJ 6最新版6.3.2:依赖SQLite3 >= 3.11;依赖CMake >= 3.9

  3)PROJ 7最新版7.2.1:依赖SQLite3 >= 3.11;依赖libtiff >= 4.0;CMake >= 3.9;可选curl >= 7.29.0

  基于以上情况,确定编译需要的文件如下:

  1)GDAL 3.3.1:gdal-3.3.1.tar.gz(https://gdal.org/download.html)

  2)PROJ 7.2.1:proj-7.2.1.tar.gz(https://proj.org/download.html)

  3)SQLite 3.36(https://www.sqlite.org/download.html)

    a)Source Code:sqlite-amalgamation-3360000.zip

    b)Precompiled Binaries for Windows:sqlite-dll-win32-x86-3360000.zip(32位dll)、sqlite-dll-win64-x64-3360000(64位dll)、sqlite-tools-win32-x86-3360000.zip(可执行程序)

  4)libtiff 4.3.0:tiff-4.3.0.zip(http://download.osgeo.org/libtiff)

  5)SWIG:swigwin-3.0.12.zip(用于编译C#代码)(https://sourceforge.net/projects/swig/files)

  环境及工具

  1)安装VS2015:需含VC++功能

  2)安装CMake:cmake-3.21.0-rc3-windows-i386.msi(https://cmake.org/download)

  下载相关文件如图:(这里存放在C:\gdal目录下)

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

 

  三、编译SQLite

  根据依赖关系,先编译SQLite3。

  1、解压文件

  32位:把sqlite-amalgamation-3360000.zip、sqlite-tools-win32-x86-3360000.zip、sqlite-dll-win32-x86-3360000.zip三个压缩包解压至同一目录下(C:\gdal\sqlite-3.36)。

  64位:把sqlite-amalgamation-3360000.zip、sqlite-tools-win32-x86-3360000.zip、sqlite-dll-win64-x64-3360000.zip三个压缩包解压至同一目录下(C:\gdal\sqlite-3.36)。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  2、新建VC++项目

  在VS2015中,新建VC++的Win32控制台应用程序,名称为sqlite,位置为"C:\gdal\sqlite-3.36",去掉"为解决方案创建目录"选项,附加选项为"空项目"。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  3、项目添加文件

  在sqlite项目右键->"添加"->"现有项",选择"sqlite3.h"、"sqlite3ext.h"、"sqlite3.c"、"sqlite3.def"共四个文件。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  4、修改sqlite3.def

  双击sqlite3.def,在文件的最后添加sqlite3_unlock_notify后保存。

   【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  5、设置项目属性

  1)右键sqlite项目->"属性",打开项目属性窗口。

  2)顶部"配置"改为"所有配置","平台"改为"所有平台"。目的是不管Debug、Release、Win32、x64,相同部分的设置均一致。

  3)左侧选择"配置属性"->"C/C++"->"预处理器",右侧"预处理器定义"点击最右边的下拉后选"编辑",在弹出的窗口中,把"<不同选项>"改为以下的值后确定。

_USRDLL
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_ENABLE_FTS5
SQLITE_ENABLE_UNLOCK_NOTIFY

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  4)左侧选择"配置属性"->"链接器"->"输入",右侧"模块定义文件"点击最右边的下拉后选"编辑",在弹出的窗口中,输入sqlite3.def后确定。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  5)左侧选择"配置属性"->"常规",右侧"配置类型"改为"静态库(.lib)"后确定,直到关闭项目属性窗口。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  6、编译生成sqlite.lib

  选择"解决方案配置"为"Release","解决方案平台"选项,32位的选"x86",64位选"x64",然后右键sqlite项目->"生成",在项目位置的Release文件夹下会生成sqlite.lib。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  7、构造结果文件夹

  在"C:\gdal\sqlite-3.36"路径中,按如下形式新建三个文件夹并复制相关文件,为后面库的编译处理提供基础。

  1)include:sqlite3.h、sqlite3ext.h

  2)bin:sqlite3.exe

  3)lib:sqlite.lib

C:\gdal\sqlite-3.36
+-- include -- sqlite3.h
|      |------ sqlite3ext.h
+-- bin ------ sqllite3.exe
+-- lib ------ sqlite.lib

 

 

  四、编译LibTiff

  1、解压文件

  把tiff-4.3.0.zip解压至C:\gdal\tiff-4.3.0。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  2、生成项目文件

  1)打开CMake (cmake-gui)程序。

  2)Where is the source code:选择tiff源码的目录,这里是C:/gdal/tiff-4.3.0。

     Where to build the binaries:选择生成项目文件的目录,这里是C:/gdal/tiff-4.3.0/build。

  3)第一次点击Configure按钮,弹出编译环境设置窗口。

  4)Specify the generator for this project:选择"Visual Studio 14 2015"。

     Optional platform for generator:32位选择"Win32",64位选择"x64"。

  5)点击Finish,CMake程序将读取编译参数并列出,如果没有问题日志栏将显示Configuring done。

  6)将CMAKE_INSTALL_PROFEX的值改为"C:/gdal/tiff-4.3.0/output",再点击一次Configure按钮。该键值是指定项目编译后存放文件的位置。

  7)最后点击Generate按钮,生成项目文件。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  3、编译生成结果

  1)打开项目文件输出目录C:\gdal\tiff-4.3.0\build,用VS2015打开里面的解决方案文件tiff.sln。

  2)选择"解决方案配置"为"Release","解决方案平台"选项,32位的选"x86",64位选"x64"。

  3)分别对项目ALL_BUILD和INSTALL右键生成,结果存放在C:\gdal\tiff-4.3.0\output。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

 

 

  五、编译PROJ

  1、解压文件

  把proj-7.2.1.tar.gz解压至C:\gdal\proj-7.2.1。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  2、生成项目文件

  1)打开CMake (cmake-gui)程序。

  2)Where is the source code:选择proj源码的目录,这里是C:/gdal/proj-7.2.1。

     Where to build the binaries:选择生成项目文件的目录,这里是C:/gdal/proj-7.2.1/build。

  3)第一次点击Configure按钮,弹出编译环境设置窗口。

  4)Specify the generator for this project:选择"Visual Studio 14 2015"。

     Optional platform for generator:32位选择"Win32",64位选择"x64"。

  5)点击Finish,CMake程序将读取编译参数并列出,这时日志栏将显示Configuring incomplete, errors occurred!,表示配置参数有误。

  6)勾上"Grouped"和"Advanced"多选框,并修改以下键的值:

    a)Ungrouped Entries.EXE_SQLITE3:C:/gdal/sqlite-3.36/bin/sqlite3.exe

    b)SQLITE3.SQLITE3_INCLUDE_DIR:C:/gdal/sqlite-3.36/include

    c)SQLITE3.SQLITE3_LIBRARY:C:/gdal/sqlite-3.36/lib/sqlite.lib

    d)TIFF.TIFF_INCLUDE_DIR:C:/gdal/tiff-4.3.0/output/include

    e)TIFF.TIFF_LIBRARY_RELEASE:C:/gdal/tiff-4.3.0/output/lib/tiffd.lib

    f)CMAKE.CMAKE_INSTALL_PREFIX:C:/gdal/proj-7.2.1/output

  7)再点击一次Configure按钮,提示参数有误,这时把ENABLE.ENABLE_CURL的选项去掉。

  8)再点击一次Configure按钮,提示参数有误,这时把BUILD.BUILD_PROJSYNC选项去掉。

  9)再点击一次Configure按钮,这次没有提示参数错误了,最后点击Generate按钮,生成项目文件。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  3、编译生成结果

  1)打开项目文件输出目录C:\gdal\proj-7.2.1\build,用VS2015打开里面的解决方案文件PROJ.sln。

  2)选择"解决方案配置"为"Release","解决方案平台"选项,32位的选"x86",64位选"x64"。

  3)分别对项目ALL_BUILD和INSTALL右键生成,结果存放在C:\gdal\proj-7.2.1\output。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

 

 

  六、编译GDAL

  1、解压文件

  1)把gdal331.zip解压至C:\gdal\gdal-3.3.1。

  2)把swigwin-3.0.12.zip解压至C:\gdal\swigwin-3.0.12。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  2、修改nmake.opt

  用文本编辑工具,打开C:\gdal\gdal-3.3.1下的nmake.opt文件,并修改以下键的值:

  1)42行处MSVC_VER,值改为1900,1900代表是VS2015。

  2)66行处GDAL_HOME,值改为"C:\gdal\gdal-3.3.1\output",该键值是指定项目编译后存放文件的位置。

  3)102行处SWIG,值改为"C:\gdal\swigwin-3.0.12\swig.exe",指定swig工具的路径。

  4)240行处DLLBUILD,值改为1,表示编译为dll文件。

  5)260行处PROJ_INCLUDE,去掉前面的#号,值改为"-IC:\gdal\proj-7.2.1\output\include"。

  6)264行处PROJ_LIBRARY,去掉前面的#号,值改为"C:\gdal\proj-7.2.1\output\lib\proj.lib shell32.lib ole32.lib"

  7)650行处SQLITE_INC,去掉前面的#号,值改为"-IC:\gdal\sqlite-3.36\include"

  8)651行处SQLITE_LIB,去掉前面的#号,值改为"C:\gdal\sqlite-3.36\lib\sqlite.lib"

  3、编译生成结果

  1)打开开始菜单->"Visual Studio 2015"->"Visual Studio Tools"->"VS2015 开发人员命令提示"。

  2)执行cd C:\gdal\gdal-3.3.1,定位到GDAL的源码目录。

  3)执行nmake -f makefile.vc开始编译。

    a)默认情况下是Release编译模式,如需要Debug编译模式,需加上DEBUG=1参数执行编译。

    b)默认情况下编译为32位文件,如需要编译为64为文件,需加上WIN64=1参数执行编译。

  4)执行nmake -f makefile.vc install,结果存放在C:\gdal\gdal-3.3.1\output。其中bin目录下的gdal303.dll就是最终生成的GDAL库文件。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

 

 

  七、编译C#接口

  通过swig编译出C#调用GDAL的接口。

  1、按需修改makefile.vc

  从3.2.0版本开始,默认情况下使用netstandard2.0编译C#的接口,但VS2015不支持netstandard2.0,故需要修改makefile.vc文件使C#接口支持.NET 4。

  用文本编辑工具,打开C:\gdal\gdal-3.3.1\swig\csharp下的makefile.vc文件,修改内容如下:

  1)32行处,!IFNDEF NETSTANDARD改为!IFDEF NETSTANDARD。

  2)35行处,!IFNDEF NETCORE改为!IFDEF NETCORE。

  2、编译生成结果

  1)打开开始菜单->"Visual Studio 2015"->"Visual Studio Tools"->"VS2015 开发人员命令提示"。

  2)执行cd C:\gdal\gdal-3.3.1\swig,定位到swig目录。

  3)执行nmake /f makefile.vc csharp。

  4)执行nmake /f makefile.vc csharp_install,结果存放在C:\gdal\gdal-3.3.1\output\csharp。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

 

 

  八、编译结果

   经过以上的编译操作,最终生成的结果保存在C:\gdal\gdal-3.3.1\output,目录下有bin、data、csharp三个文件夹。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  1)bin:存放GDAL编译后生成的动态链接库gdal303.dll及相关的工具。其中gdal303.dll封装了GDAL的所有功能,C#调用的必要文件。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  2)data:存放GDAL处理时需要的描述性文件,如坐标系信息、配置信息、模版信息、图片等,使用时需要设置GDAL_DATA环境变量并指向该文件夹、

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  3)csharp:存放供C#调用的动态链接库,分为4组,分别是gdal、ogr、osr和gdalconst。每组分别由_csharp和_wrap结尾的dll文件组成。在VS中引用的是_csharp结尾的dll文件,引用后需要将对应的_wrap结尾的dll文件复制到输出的目录中。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

 

 

  九、C#调用测试

  1、编写调用代码

  在VS2015中,新增控制台应用程序,引用C:\gdal\gdal-3.3.1\output\csharp下的gdal_csharp.dll和ogr_csharp.dll,代码如下:

  1)Gdal.AllRegister():注册GDAL所有驱动(栅格数据处理)

  2)Ogr.RegisterAll():注册OGR所有驱动和(矢量数据处理)

  3)PrintDriversGdal():打印已加载的GDAL驱动名称

  4)PrintDriversOgr():打印已加载的OGR驱动名称

using OSGeo.GDAL;
using OSGeo.OGR;
using System;

namespace GdalDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Gdal.AllRegister();
            Ogr.RegisterAll();

            PrintDriversGdal();
            PrintDriversOgr();

            Console.ReadKey();
        }

        private static void PrintDriversGdal()
        {
            int num = Gdal.GetDriverCount();
            for (int i = 0; i < num; i++)
            {
                var driver = Gdal.GetDriver(i);
                Console.WriteLine(string.Format("GDAL {0}: {1}-{2}", i, driver.ShortName, driver.LongName));
            }
        }

        private static void PrintDriversOgr()
        {
            int num = Ogr.GetDriverCount();
            for (int i = 0; i < num; i++)
            {
                var driver = Ogr.GetDriver(i);
                Console.WriteLine(string.Format("OGR {0}: {1}", i, driver.name));
            }
        }
    }
}

  这时运行会报错"未能加载文件或程序集gdal_csharp或它的某一个依赖项"。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  2、修改目标平台

  报错的原因是默认目标平台是Any CPU,需要改为x86,再次运行报错"OSGeo.GDAL.GdalPINVOKE的类型初始值设定项引发异常"。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  3、补充依赖动态链接库文件

  报错的原因是找不到依赖的动态链接库文件,首先从C:\gdal\gdal-3.3.1\output\bin把gdal303.dll复制到项目输出目录,再把项目中两个引用的类库对应的wrap文件(gdal_wrap.dll、ogr_wrap.dll)从C:\gdal\gdal-3.3.1\output\csharp复制到项目输出目录。再次运行没有报错,控制台输出了已注册的GDAL和OGR的驱动名称,其中已注册的GDAL驱动175个,已注册的OGR驱动57个,至此C#初步调用GDAL成功。

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

  【C#】GDAL3编译(一):Windows下超详细编译C#版GDAL3(VS2015+.NET 4+32位/64位)

 

上一篇:mysql qt


下一篇:有哪位大佬知道怎么使用sqlite保存图片吗?