VS2015编译GDAL3.2.0+opencl+C#

参考借鉴https://www.cnblogs.com/litou/p/15004877.html

参考借鉴https://www.cnblogs.com/xiaowangba/p/6313903.html

参考借鉴gdal、proj、geos、sqlite等在VS2015下编译和配置_vs2015编译sqlite3-CSDN博客

参考借鉴Windows下GDAL3.1.2编译 (VS2015)_gdal windows编译-CSDN博客

之前一直用gdal.2.x版本,用的还是vs2013编译,因最近需要新版的影像处理工具,并用到gdal GPU加速,于是便基于gdal3.x重新编译了。借鉴了网上教程,选定了gdal3.2.0+proj6.3.0+sqlite3.3.6版本。

一、编译前准备工作
1)GDAL3.2.0:依赖PROJ >= 6;依赖VC++ >= 1900(即>=2015);依赖SQLite3

2)PROJ6.3.0:依赖SQLite3 >= 3.11;依赖CMake >= 3.5(https://proj.org/en/6.3/install.html#build-requirements)

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

1)GDAL 3.2.0:gdal-3.2.0.tar.gz(https://github.com/OSGeo/gdal/releases/download/v3.2.0/gdal-3.2.0.tar.gz)

2)PROJ 6.3.0:proj-6.3.0.tar.gz(https://download.osgeo.org/proj/proj-6.3.0.tar.gz)

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

a)Source Code:sqlite-amalgamation-3360000.zip(https://www.sqlite.org/2021/sqlite-amalgamation-3360000.zip)

b)Precompiled Binaries for Windows:
sqlite-dll-win64-x64-3360000(https://sqlite.org/2021/sqlite-dll-win64-x64-3360000.zip)、
sqlite-tools-win32-x86-3360000.zip(https://www.sqlite.org/2021/sqlite-tools-win32-x86-3360000.zip)

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

安装环境
1)安装VS2015:需含VC++功能(若vs2015安装时出错,安装包版本可能为专业版文件大小3.7GB的,请安装社区版文件大小7GB的,以免后续编译过程中出现报错。https://download.microsoft.com/download/5/d/1/5d1ec81e-bc59-448f-9ab6-27636d5cc18a/vs2015.3.com_chs.iso,)

2)安装CMake:cmake-3.22.6-windows-x86_64.msi(https://cmake.org/files/v3.22/cmake-3.22.6-windows-x86_64.msi)

二、sqlite3编译
2.1 解压sqlite-amalgamation-3360000.zip,得到头文件sqlite3.h,sqlite3ext.h,以及源文件shell.c,sqlite3.c;
2.2 解压sqlite-dll-win64-x64-3360000.zip,得到sqlite3.def,sqlite3.dll,与步骤1的文件放在同一目录下,


2.3编译
1)手动创建一个空的Win32控制台程序,sqlite3;
2)将shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h、sqlite3.def 文件添加到工程中;

3)设置预定义处理;
    属性 --->>> C/C++ --->>> 预处理器 --->>> 预处理器定义中添加如下,
        
    _USRDLL
    SQLITE_ENABLE_RTREE
    SQLITE_ENABLE_COLUMN_METADATA
    SQLITE_ENABLE_FTS5
    SQLITE_ENABLE_UNLOCK_NOTIFY
    
4)设置模块定义文件

    链接器 --->>> 输入 --->>> 模块定义文件:sqlite3.def
    
5)修改模块定义文件

    用文本编辑打开sqlite3.def在最后追加:sqlite3_unlock_notify;
    
6)配置类型改为静态库lib库

    配置属性 --->>> 常规 --->>>项目默认值 --->>>配置类型:静态库lib

7)打开配置管理器,设置解决方案为Release,平台为x64
8)生成项目,即得sqlite3.lib
9)安装
   创建sqlite3_install目录,其下再创建bin,include,lib文件目录,分别放置
   sqlite3.exe,
   sqlite3.h、sqlite3ext.h,
   sqlite3.lib 即可
        


三、PROJ编译
3.1 在PROJ-6.3目录中新建一个名为build.bat文件。用于执行camke命令行构建Visual Studio 工程;


3.2 编写编译bat,设置sqlite3 inlcude ,lib, exe路径,设置构建目录proj4_build和安装目录proj4_install

@echo off
REM 定义SQLite的Include目录变量
set SQLITE3_INCLUDE_DIR="%cd%\sqlite3_install\include" REM 定义SQLite的Lib路径变量
set SQLITE3_LIBRARY="%cd%\sqlite3_install\lib\sqlite3.lib"REM 定义SQLite的exe路径变量 
set EXE_SQLITE3="%cd%\sqlite3_install\bin\sqlite3.exe"REM 定义源代码路径路径变量 
set src_dir="%cd%"echo %src_dir%REM 定义构建VisualStudio工程目录变量 
set build_dir="%cd%/../proj4_build"REM 定义安装目录变量 
set install_dir="%cd%/../proj4_install"REM 创建VisualStudio工程目录
mkdir %build_dir%REM 创建安装目录
mkdir %install_dir%REM 定义cmake安装编译的类型
set CMAKE_BUILD_TYPE=ReleaseREM 定义cmake安装目录
set CMAKE_INSTALL_PREFIX=%install_dir%REM 回到构建VisualStudio工程目录
cd %build_dir%REM 调用camke命令行参数
cmake -G "Visual Studio 14 2015" -A x64   -S %src_dir%  -B %build_dir% -DSQLITE3_INCLUDE_DIR=%SQLITE3_INCLUDE_DIR% -DSQLITE3_LIBRARY=%SQLITE3_LIBRARY% -DEXE_SQLITE3=%EXE_SQLITE3%    -DCMAKE_BUILD_TYPE=%CMAKE_BUILD_TYPE%  -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_PREFIX%                              pause

1)通过VS2015 x64 本机工具命令指示符,进入命令界面;
2)通过cd命令进入到build.bat文件所在目录; 
3)运行build.bat;
4)打开proj_build文件夹下的proj.sln,生成项目 ALL_BUILD 以及 INSTALL 即可;

四、GDAL编译
4.1 gdal基本设置
gdal-3.2.0.tar.gz解压到E:\gdal_source\gdal-3.2.0,找到目录下的nmake.opt文件:

第42行左右,找到MSVC_VER=设置为1900(1900是指 VS 版本为2015,1910是指 VS 版本为2017,1921是指 VS 版本为2019)。
第66行左右,找到GDAL_HOME =位置为你想编译后输出的路径,比如"D:\gdal_source\gdal-3.2.0-build"。
第213行左右,找到WIN64=YES,固定生成64位版本,取消注释本行。
第240行左右,找到DLLBUILD=设置为1启动动态编译、 0为静态编译。
第260行左右,找到PROJ_INCLUDE,PROJ_LIBRARY。分别设置成PROJ6的include和lib文件夹(其中PROJ_INCLUDE的-I后为地址)。
第650行左右,找到SQLITE_INC,SQLITE_LIB。设置方式同上。

4.2 opencl设置
1)首先在nmake.opt文件参考其他的引用库,添加OpenCL的库目录。首先在namke.opt找到下面这行:
第941行左右,END OF STUFF THAT NORMALLY NEEDS TO BE UPDATED 
在上面这行代码的前面添加如下代码(使用的是NVIDIA的CUDA安装包下面的OpenCL库):

# Uncomment for OPENCL_AMD support
!IFDEF INCLUDE_OPENCL
OPENCL_DIR="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8"
OPENCL_CFLAGS = -I$(OPENCL_DIR)/include -DHAVE_OPENCL
OPENCL_LIB    = $(OPENCL_DIR)/lib/x64/OpenCL.lib
!ELSE
OPENCL_DIR=
OPENCL_CFLAGS = -I
OPENCL_LIB     = 
!ENDIF

2)然后在上面那行代码(END OF STUFF THAT NORMALLY NEEDS TO BE UPDATED)的下面添加下面的代码:
# liml
!IFDEF INCLUDE_OPENCL
OPENCL_FLAG = -DHAVE_OPENCL
!ENDIF

2)找到973行左右, CFLAGS    =    $(OPTFLAGS)这行代码,在$(OPTFLAGS)前面添加$(OPENCL_FLAG),注意要留下之间空格,即
CFLAGS    =    $(OPENCL_FLAG) $(OPTFLAGS)

3)找到文件最后,代码EXTERNAL_LIBS =,在最后添加$(OPENCL_LIB)

4)转到gdal根目录,找到alg目录下的makefile.vc文件,
首先在文件中OBJ = 的前面添加下面的代码,用来设置使用OpenCL的宏定义;
!IFDEF INCLUDE_OPENCL
EXTRAFLAGS = $(EXTRAFLAGS) $(OPENCL_CFLAGS) -DHAVE_OPENCL
!ENDIF

然后在文件中OBJ = 的后面添加OpenCL的算法文件gdalwarpkernel_opencl.obj


5)编译
打开VS2015的x64 Native Tools Command Prompt for VS 2015命令行,右键使用管理员运行,cd到gdal根目录,依次运行以下命令

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

4.3 c#设置
1)在nmake.opt文件设置swig.exe路径,
找到102行左右,SWIG = "E:\swigwin-3.0.12\swig.exe"

2)用文本编辑工具,打开E:\gdal_source\gdal-3.2.0\swig\csharp下的makefile.vc文件,修改内容如下:

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

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

  c)40行处,CSC=csc /platform:anycpu 改为 CSC=csc /platform:x64。(64位编译必须要修改)


3)编译

打开VS2015的x64 Native Tools Command Prompt for VS 2015命令行,右键使用管理员运行,cd到E:\gdal_source\gdal-3.2.0\swig\csharp,依次运行以下命令

nmake -f makefile.vc interface WIN64=1
nmake -f makefile.vc WIN64=1
nmake -f makefile.vc install WIN64=1

测试执行:gdalwarp -tr 0.02 0.02 F:\TestData\merge\cun.tif F:\TestData\cun_out3_2.tif -wo USE_OPENCL=TRUE -co COMPRESS=LZW -co BIGTIFF=YES -wt Int16 -r bilinear

五 注意事项

1.编译过程中出现报错,如json,javascript诸如问题,可能为vs2015问题,若vs2015安装包版本为专业版文件大小3.7GB的,安装过程中应该会提示找不到安装文件,请卸载后并重新下载社区版文件大小7GB的,以免后续编译报错。https://download.microsoft.com/download/5/d/1/5d1ec81e-bc59-448f-9ab6-27636d5cc18a/vs2015.3.com_chs.iso。

2.gdal3.x需手动设置PROJ_LIB路径,否则执行gdal命令会提示缺乏proj.db问题,通过设置环境变量PROJ_LIB,如PROJ_LIB=E:\gdal_source\proj\proj4_install\share\proj 即可解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/213501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串String

字符串字面量 let s "hello";变量s属于字符串字面量,它们属于硬编码进程序的字符串值,属于不可变的类型。但并不是所有字符串的值都能够在编写代码时确定。 String类型 String类型会在堆上分配到自己需要的存储空间,所以它能够…

Nacos简介

1.Nacos简介 1.1.为什么叫Nacos? 前四个字母分别为Naming和Configuration的前两个字母,最后的s为service。 1.2.Nacos是什么? nacos是第二代微服务SpringCloudAlibaba开源的一款注册中心和分布式配置中心组件,其功能上为第一代微…

声明式数据建模、定义简单易懂:下一代 ORM 助你效率倍增 | 开源日报 No.102

prisma/prisma Stars: 34.0k License: Apache-2.0 Prisma 是一个下一代 ORM,包括以下工具: Prisma Client:为 Node.js 和 TypeScript 自动生成的类型安全查询构建器Prisma Migrate:声明式数据建模和迁移系统Prisma Studio&#…

山人求道篇:五、交易中的大道至简与奥卡姆剃刀

量化的剃刀不是减去因子、减去代码,而是减去冗余信息量 市面上有的策略对各品种设置了不同参数,每个品种进场不一样就算了,出场参数还不一样,那你说他到底赚的是什么利润呢? 他自己也不知道,主要目的是为…

鸿蒙应用开发(二)环境搭建

开发流程 IDE下载 首先下载HUAWEI DevEco Studio,介绍首次启动DevEco Studio的配置向导: 运行已安装的DevEco Studio,首次使用,请选择Do not import settings,单击OK。安装Node.js与ohpm。node.js 是基于 V8 引擎构…

JavaScript常用技巧专题二

文章目录 一、前言二、生成随机字符串三、转义HTML特殊字符四、单词首字母大写五、将字符串转换为小驼峰六、删除数组中的重复值七、移除数组中的假值八、获取两个数字之间的随机数九、将数字截断到固定的小数点十、日期10.1、计算两个日期之间天数10.2、从日期中获取是一年中的…

【Java编程实现 9 * 9 乘法表格打印四种形态,七种打法】

Java编程实现 9 * 9 乘法表格打印四种形态,七种方法打印 废话篇打印 9 * 9 乘法表格嵌套for循环实现左下角打印嵌套for循环实现左上角打印嵌套for循环实现右上角打印嵌套for循环实现右下角打印 使用while循环打印 9 * 9 乘法表格(一)使用whil…

1003 我要通过!

“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。 得到“答案正确”的条件是: 字符串中必须仅有 P、 A、 T这三种…

详解Keras3.0 Layers API: Core layers

1、Input keras.Input(shapeNone,batch_sizeNone,dtypeNone,sparseNone,batch_shapeNone,nameNone,tensorNone, ) 参数说明 shape: 输入张量的形状。如果为None,则可以动态地指定形状。batch_size: 批处理大小。如果为None,则可以动态地指定批处理大小…

基于SpringBoot+Vue前后端分离的景点数据分析平台(Java毕业设计)

大家好,我是DeBug,很高兴你能来阅读!作为一名热爱编程的程序员,我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里,我将会结合实际项目经验,分享编程技巧、最佳实践以及解决问题的方法。无论你是…

awt中文乱码-Intellij IDEA

乱码的根本原因在于秦始皇嘎太早了(bushi 解决方法:肉眼可见的编码设置统一为GBK 1.打开设置找到文件编码 2.肉眼可见的编码统统改成GBK 有人该问了,为什么不改成utf-8,因为awt的编码由操作系统决定,我的是win家庭中…

Nextui使用

安装和使用 https://nextui.org/docs/frameworks/nextjs 自定义主题 https://nextui.org/docs/customization/customize-theme // tailwind.config.js const {nextui} require("nextui-org/react");/** type {import(tailwindcss).Config} */ module.exports {…

deepstream docker安装

介绍 deepstream为dGPU和Jetson平台提供dockers containers,这些镜像可以方便开发者很快地部署deepstream应用。deepstream的docker images可以在NGC web中得到。 安装Docker Docker 是一个开源的容器化平台,它允许你构建,测试&#xff0c…

29. 如何在Spring所有BeanDefinition注册完后做扩展?

如何在Spring所有BeanDefinition注册完后做扩展? 通常可以使用beanFactoryPostProcessor 对已注册的BeanDefinition进行修改或者通过它的子接口BeanDefinitionRegistryPostProcessor 再进行注册额外扩展 BeanDefinitionRegistryPostProcessor 1、概述 public interface Bea…

0基础学java-day18-( 坦克大战【2】)

课件资源放在文末 1.线程-应用到坦克大战 1.1 坦克大战 0.3 【坦克类:包括坦克的基本属性,以及坦克的移动方法】 package com.hspedu.tankgame03;/*** author 韩顺平* version 1.0*/ public class Tank {private int x;//坦克的横坐标private int y;…

XMemcached network layout exception java.nio.channels.ClosedChannelException

java.nio.channels.ClosedChannelException 表示尝试在已关闭的通道上进行 I/O 操作,通常发生在网络连接意外关闭后尝试在关闭的通道上执行读取或写入操作。 XMemcached network layout exception 可能是由于 XMemcached 客户端在尝试与 Memcached 服务器通信时发生…

一些AG10K FPGA 调试的建议-Douglas

PLL AGM FPGA 在配置成功时,PLL 已经完成锁定,lock 信号已经变高;如果原设计中用 lock 信号输出实现系统 reset 的复位功能,就不能正确完成上电复位;同时,为了保证 PLL 相移的稳定,我们需要在 P…

C++笔记之重载和重写辨别

C笔记之重载和重写辨别 code review! 文章目录 C笔记之重载和重写辨别重载(overloading)重写(Overriding) 在C中,重载(overloading)和重写(overriding)是面向对象编程中…

笔记69:Conv1d 和 Conv2d 之间的区别

笔记地址:D:\work_file\(4)DeepLearning_Learning\03_个人笔记\4. Transformer 网络变体 a a a a a a a a a a a

设计模式-门面模式(Facade)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、定义二、结构 前言 在组件构建过程中,某些接口之间直接依赖会带来很多问题,甚至无法直接实现。采用一层间接接口,来隔离…