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=Release
 
REM 定义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 即可解决。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之设备管理》(28)

《Linux操作系统原理分析之设备管理》(28) 9 设备管理9.1 设备与设备管理9.1.1 设备的分类 9.2 I/O 控制方式9.2.1CPU 控制方式9.2.2 通道控制方式 9.3 缓冲技术9.3.1 缓冲技术的引进9.3.2 缓冲的种类 9.4 设备的分配9.4.1 设备管理的数据结构9.4.2 设备…

SQL Server——权限管理

一。SQL Server的安全机制 SQL Server 的安全性是建立在认证和访问许可两种安全机制之上的。其中.认证用来确定登录Sal Server 的用户的登录账户和密码是否正确.以此来验证其是否具有连接SQL Server 的权限;访问许可用来授予用户或组能够在数据库中执行哪…

火狐,要完了!

在过去几年中,关于Firefox 浏览器的衰落有过不少讨论。目前来说,很多公共的以及私营的大型网站都缺乏对Firefox的适当支持。但是Firefox也多次试图“自救”,甚至就在不久前,Mozilla 通过官博发文,表示 Firefox 在 2023…

ODrive移植keil(九)—— 抗齿槽效应算法

目录 一、齿槽效应1.1、齿槽效应的定义1.2、产生原因1.3、解决办法 二、硬件接线三、ODrive官方代码操作3.1、固件版本v0.5.13.2、抗齿槽校准原理3.3、校准注意事项3.4、校准操作 四、移植后的代码操作五、总结 ODrive、VESC和SimpleFOC 教程链接汇总:请点击   一、…

网络安全行业大模型调研总结

随着人工智能技术的发展,安全行业大模型SecLLM(security Large Language Model)应运而生,可应用于代码漏洞挖掘、安全智能问答、多源情报整合、勒索情报挖掘、安全评估、安全事件研判等场景。 参考: 1、安全行业大模…

【Java 基础】24 日期操作

文章目录 1.Date2.LocalDate3.LocalTime4.LocalDateTime5.DateTimeFormatter6.Period7.Duration8.ZoneId9.ZonedDateTime总结 日期和时间是我们常见的操作对象,Java 也提供了强大的日期和时间处理类库,使我们可以方便的进行日期的表示、计算、格式化等。…

SQL Server数据库的备份和还原

6.2 SQL Server备份和还原 数据库管理员最担心的情况就是数据库瘫痪,造成数据丢失,而备份作为数据的副本,可以有 效地保护和恢复数据。本节将介绍数据备份的原因,备份的方式.SOL Server的恢复模式.以及备 份策略和备份设备。 6.2…

思维模型 色彩心理效应

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知色彩影响情绪。 1 色彩心理效应的应用 1.1 色彩心理效应在营销中的应用 1 可口可乐公司的“红色”营销 可口可乐公司是全球最著名的饮料品牌之一,其标志性的红色包装已经成为了…

嵌入式_基于STM32F4标准库的Flash读写操作

嵌入式_基于STM32F4标准库的Flash读写操作 文章目录 嵌入式_基于STM32F4标准库的Flash读写操作前言一、STM32F4的 Flash 简介二、闪存的读写操作1.闪存的读取2.闪存的解锁、擦除和写入1.闪存解锁2.闪存擦除3.闪存写入 三、完整代码 前言 在STM32芯片内有一个Flash存储器断电后…

整数二分的建模

当题目能够使用整数二分法建模时&#xff0c;主要有整数二分法思想进行判定&#xff0c;它的基本形式如下&#xff1a; while(left < right) {int ans;//记录答案 int mid left (right - left) / 2;//二分if(check(mid)){//检查条件&#xff0c;如果成立 ans mid;//记录…

学习spring、springmvc、mybatis、ssm所有可能用到的依赖总结,父工程pom文件依赖,<packaging>pom</packaging>

1、父工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/PO…

Java:UDP 通信方法(发送 + 接收)并 实现简单的聊天 详细代码

文章目录 UDP 通信编程发送 数据接收 数据实现简易的通信聊天 UDP 通信编程 发送 数据 创建 DatagramSocket 对象&#xff08;创办 快递公司&#xff09; 不传参&#xff0c;随机一个可用端口&#xff0c;传参&#xff0c;可指定端口。&#xff08;发送端口&#xff09;创建 …

Leetcode算法题笔记(1)

目录 哈希1. 两数之和1.1 解法11.1 解法2 2. 字母异位词分组2.1 解法12.2 解法2 3. 最长连续序列3.1 解法 小结 双指针4. 移动零4.1 解法14.2 解法2 5. 盛最多水的容器5.1 解法一5.2 解法二 6. 三数之和6.1 解法16.2 解法2 7. 接雨水7.1 解法1 小结 滑动窗口8. 无重复字符的最长…

随机Numpy数组的创建方法(第2讲)

随机Numpy数组的创建方法 &#xff08;第2讲&#xff09;         &#x1f379;博主 侯小啾 感谢您的支持与信赖。☀️ &#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&…

代码随想录算法训练营 ---第五十八天

今天开启单调栈的征程。 第一题&#xff1a; 简介&#xff1a; 本题有两种解法&#xff0c;第一种&#xff1a;暴力破解 两层for循环 时间复杂度为O(n^2) 超时了 第二种&#xff1a;单调栈解法也是今天的主角。 单调栈是什么&#xff1f; 单调递增栈&#xff1a;单调递增栈…

在vue中深度选择器的使用

一、为什么要使用深度选择器 在vue中&#xff0c;当我们使用了第三方库中的组件时&#xff0c;想要更改一些样式&#xff0c;达到我们想要的效果&#xff0c;由于scoped的影响直接编写同名样式时&#xff0c;是覆盖不了组件内的样式的。 为了达到我们想要的效果&#xff0c;…

关于最长上升子序列的动态规划问题的优化算法(二分搜索)

最长递增子序列 暴力解法&#xff1a; 思路&#xff1a;使用动态规划的思想&#xff0c;判断当前元素之前的所有元素&#xff0c;如果比当前元素小&#xff0c;则修改当前元素的最长递增子序列&#xff08;需判断是否需要修改&#xff09;。 时间复杂度&#xff1a;O(n^2) im…

智能优化算法应用:基于天鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于天鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于天鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.天鹰算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

记一次Java内存溢出导致程序宕机的问题及排查

Hi, I’m Shendi 记一次Java内存溢出导致程序宕机的问题及排查 问题场景 今天在使用工具中的 word 转 pdf 出了问题&#xff0c;报502错误&#xff0c;打开服务器发现服务被关闭了&#xff0c;起初以为是误关&#xff0c;打开后重新转换又出现了这个问题&#xff0c;在项目文件…

Redis保证高可用的三种方式

Redis保证高可用主要有三种方式&#xff1a;主从、哨兵、集群。 主从复制了解吗&#xff1f; Redis主从复制简图 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的 Redis 服务器。前者称为 主节点(master)&#xff0c;后者称为 从节点(slave)。且…