gdal的编译比较麻烦,情况有很多种,今天我编译的gdal遇到的问题就和以前的有点不一样,仅供参考借鉴。

1、下载gdal源码

gdal源码下载地址:https://trac.osgeo.org/gdal/wiki/DownloadSource

已经编译好的gdal版本下载地址:http://www.gisinternals.com/

我下载的是最新的gdal211,不知道为什么,后面编译出来的是gdal201的版本。

2、开始编译C++的开发版本

gdal在window编译提供的方法:http://trac.osgeo.org/gdal/wiki/BuildingOnWindows

为了编译64位的gdal,我修改了nmake.opt文件189行处的代码将#WIN64=YES 改成了WIN64=YES

然后使用cmd设置编译环境:

call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64

然后进入到gdal目录,依次执行如下命令:

1、C:\GDAL> nmake /f makefile.vc
2、C:\GDAL> nmake /f makefile.vc install
3、C:\GDAL> nmake /f makefile.vc devinstall

编译完后会在C盘下面生成warmerda文件夹,里面的文件是用来提供C++编译的,如下图:

注意:如果编译环境设置错误,第一步编译完后会提示如下错误:

 3、编译C#使用的版本

编译C#使用的版本需要借助swig工具,下载地址如下:http://prdownloads.sourceforge.net/swig/swigwin-3.0.10.zip

下载完后解压,打开nmake.opt,将swig=swig.exe修改成SWIG =E:\swigwin-3.0.10\swig.exe

然后接着上面三句编译命令之后,进入到swig\csharp目录下,执行如下命令:

1、nmake /f makefile.vc
2、nmake /f makefile.vc install

注意:在1编译过程中会出现如下问题:

借鉴博客:GDAl编译C#,Python支持出现的错误

问题1、接口重定义

osr\OsrPINVOKE.cs(,): error CS0111: 类型“OSGeo.OSR.OsrPINVOKE”已定义了一个名为“OsrPINVOKE”的具有相同参数类型的成员
osr\OsrPINVOKE.cs(,): (与前一个错误相关的符号位置) NMAKE : fatal error U1077: “C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.EXE”: 返回代码“0x1”

解决办法:进入到..\gdal-1.9.2\swig\csharp\gdal|ogr|osr三个文件夹下,找到GdalPINVOKE.cs、OgrPINVOKE.cs、OsrPINVOKE.cs,将提示中重复的参数类型删除掉即可,错误示例如下图:

问题2:接口成员名称调用错误,错误提示:

gdal\Band.cs(,): error CS0117: “OSGeo.GDAL.GdalPINVOKE”并不包含“BandUpcast”的定义 
gdal\Dataset.cs(,): error CS0117: “OSGeo.GDAL.GdalPINVOKE”并不包含“DatasetUpcast”的定义
gdal\Driver.cs(,): error CS0117: “OSGeo.GDAL.GdalPINVOKE”并不包含“DriverUpcast”的定义
NMAKE : fatal error U1077: “C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.EXE”: 返回代码“0x1”

GdalPINVOKE.cs定义接口如下:

Band类(举一例)调用如下:

将三个类中的接口修改一下即可:

public Driver(IntPtr cPtr, bool cMemoryOwn, object parent) : base(GdalPINVOKE.Driver_SWIGUpcast(cPtr), cMemoryOwn, parent) { swigCPtr = new HandleRef(this, cPtr); 

public Dataset(IntPtr cPtr, bool cMemoryOwn, object parent) : base(GdalPINVOKE.Dataset_SWIGUpcast(cPtr), cMemoryOwn, parent) { swigCPtr = new HandleRef(this, cPtr); 

public Band(IntPtr cPtr, bool cMemoryOwn, object parent) : base(GdalPINVOKE.Band_SWIGUpcast(cPtr), cMemoryOwn, parent) { swigCPtr = new HandleRef(this, cPtr);

修改完后即可编译成功,编译成功之后C:\warmerda\bld文件夹下会生成scharp文件,供C#编程使用。

4、测试程序报错

问题1、测试程序注册gdal时出现错误

System.MethodAccessException”类型的未经处理的异常出现在 gdal_csharp.dll 中。 
其他信息: 安全透明方法“OSGeo.GDAL.Gdal.AllRegister()”尝试通过方法“OSGeo.GDAL.GdalPINVOKE.AllRegister()”调用本机代码失败。方法必须是安全关键的或安全可靠关键的,才能调用本机代码。

解决办法:

修改swig生成的C#封装类代码,强制声明为可被安全透明代码调用即可,以..\swig\csharp\gdal\Gdal.cs类和..\swig\csharp\gdal\Dataset.cs类为例,在其类声明的开头添加下述两行代码:

using System.Security;
[SecuritySafeCritical]

截图如下:

如果还出现上面问题,依次添加 [SecuritySafeCritical] 即可。

问题2、测试程序成功之后出现错误:

解决办法,同样的在Geometry的Dispose方法上加入 [SecuritySafeCritical],如下图所示

类似的问题解决方法相同。

gdal编译C#开发版本的更多相关文章

  1. zlib开发笔记(四):zlib库介绍、编译windows vs2015x64版本和工程模板

    前言   Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库.需要用到zlib的msvc2015x64版本,编译一下.   版本编译引导 zlib在windows上的mingw32 ...

  2. VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4

    对于一些已经解决的问题,本博客不再讨论.只将本人遇到的问题做简单的说明. 一.VS 2013编译64位版本QT 4.8.6 QT项目官网中,对于QT4,其只提供了windows X86的版本,并且支持 ...

  3. 如何搭建SBT编译Scala开发的Android工程

    作者:戚明峰 最近接触了shadowsocks的Android客户端项目源码(https://github.com/shadowsocks/shadowsocks-android),刚好这个项目是使用 ...

  4. 手动编译PHP开发环境

    目录 手动编译PHP开发环境 问题复盘 部署环境及配置 目标环境 安装部署环境开始 首先安装PHP 安装mysql 安装nginx 手动编译PHP开发环境 这是一篇来自深夜加班的手稿 问题复盘 你有没 ...

  5. FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建

    前言   本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8.   FFmpeg简介   FFmpeg是领先的多媒体框架,能够解码 ...

  6. [转载]Linux 环境下编译 0.11版本内核 kernel

    最近在看<.如果Clobber/Modify 为空,则其前面的冒号(:)必须省略. 2.如果Output,Input,Clobber/Modify都为空,Output,Input之前的冒号(:) ...

  7. 由源代码编译SpriteBuilder最新版本1.5.0搭配最新的Cocos2D 3.4.9

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 大家知道SpriteBuilder版本停留在1.4.9已经很久 ...

  8. Android 开发版本统一

    一.概述 对于 Android 开发版本的统一涉及到的东西就是 Gradle 中的全局设置,我们通过配置 gradle 也就是编写 Groovy 代码将开发中的版本号设置为全局参数.这样就能够在 mo ...

  9. win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建

    win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建 重编译的优点:能够调试的时候看OpenCV的源码. 重编译要得到的东西:Debug版本号和Release版本号 ...

随机推荐

  1. Android Hotpatch系列之-项目介绍

    给现实Android apk打补丁,不用强迫客户升级客户端,悄悄的就把bug修复了,程序猿再也不用被老大骂娘了. 客户端例子实现:https://github.com/fengcunhan/Hotpa ...

  2. MQTT协议的简单介绍和服务器的安装

    最近公司做的项目中有用到消息推送,经过多方面的筛选之后确定了使用MQTT协议,相对于XMPP,MQTT更加轻量级,并且占用用户很少的带宽. MQTT是IBM推出的一种针对移动终端设备的基于TCP/IP ...

  3. VS Copy Files after build

    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ItemGroup> ...

  4. SpringMVC学习系列(1) 之 初识SpringMVC

    1.前言: 与SpringMVC的结识源于个人之前想做一个微信公众账号的管理平台玩玩,既然要做就需要考虑平台的选择问题.由于我的朋友只有一台运行了Linux系统的虚拟主机,且上面还运行有他自己的一些论 ...

  5. SSIS 参数与环境

    微软 BI 系列随笔 - SSIS 基础 - 参数与环境 简介 在上一篇博客中,主要讲述了如何实现SSIS的项目部署,参见 微软 BI 系列随笔 - SSIS 2012 基础 - SSIS 项目部署模 ...

  6. eclipse将编辑栏一分为二

    今天无意中发现一个MyEclipse的功能,CTRL SHIF - 三个键一起按下时,同一个编辑窗口会一分为二.这样我们写下面代码需要参考前面代码的时候就很方便了.

  7. Win32编程:窗口类样式+窗口外观样式+窗口显示样式

    1.窗口类样式WNDCLASS.style CS_VREDRAW 提供窗口位置变化事件和高度变化事件的处理程序,功能是重绘窗口 CS_HREDRAW 提供窗口位置变化事件和宽度变化事件的处理程序,功能 ...

  8. onmouseover和onmouseout的那些事

    这篇文章来自一个偶然...以前刚开始学习javascript事件的时候就被一个东西搞得晕头撞向的.就是一对名字很相近的事件.一组是onmouseover()和onmouseout().另一组就是onm ...

  9. php配置

    在 php.ini 文件中设置 cgi.fix_pathinfo=0 ,能避免掉很多不必要的 stat() 系统调用.

  10. AnyCAD .Net SDK 用户手册 v2013.1

    AnyCAD .Net SDK 用户手册 v2013.1 1. 简介 AnyCAD .Net SDK为.Net4.0开发者提供简单易用的三维建模和三维可视化的API.SDK主要由三维建模的API和可视 ...