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类型会在堆上分配到自己需要的存储空间,所以它能够…

声明式数据建模、定义简单易懂:下一代 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…

基于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…

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;…

一些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)

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

浅谈CompletableFuture

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 回顾FutureTask 之前我…

安全高效 江西变电站成功应用国家电网无人机巡检

随着电力需求的迅速增长,电网的巡检、维护与保养变得越来越重要。为迎接这一挑战,江西供电公司的一座变电站成功引入了复亚智能国家电网无人机巡检系统,在提升巡检水平、开创新型巡检模式方面做出了重要尝试,为电网设备的高效巡检…

EDA 数字时钟

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、数字时钟是什么?二、EDA里面数码管的显示1.元件模型2.参考程序3. 实验仿真波形4.实验现象5. 仿真问题 三、显示时钟1. 时钟电路模块2.参考程序3…

gRPC .net学习

学习helloworld server用.net client有.net的控制台 和 unity server端 直接使用vs2022创建(需自行看有无装asp.net哦),搜索gPRC,使用6.0吧,创建工程后直接F5跑起来,服务端到此完成 .net控制台client,创建新的控制台,使用NuGet,然后导入server端的Protos文件夹 学…

基于Jedis来探讨池化技术

为什么需要池化技术 系统运行时必然是需要数据库连接、线程等一些重量级对象,频繁的创建这种对象对性能有着不小的开销,所以为了减少没必要的创建和开销,我们就用到了池化技术。 通过创建一个资源池来保存这些资源便于后续的复用&#xff0c…

【C++初阶】七、内存管理(C/C++内存分布、C++内存管理方式、operator new / delete 函数、定位new表达式)

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 【C初阶】六、类和对象(初始化列表、static成员、友元、内部类)-CSDN博客 目录 一 . C/C内存分布 C/C中程序内存区域划分: 二 . C内存管理方式 …