【GDAL】Windows下VS+GDAL开发环境搭建

Step.0 环境说明(vs版本,CMake版本)

本地的IDE环境是vs2022,安装的CMake版本是3.25.1。

Step.1 下载GDAL和依赖的组件

编译gdal之前需要安装gdal依赖的组件,gdal所依赖的组件可以在官网文档找到,可以根据自己的开发需求来下载编译相应的组件,在这里仅支持常用的数据及功能,所以就只下载了sqlite,libtiff,proj者几个依赖组件,下载的地址如下:
sqlite:https://www.sqlite.org/download.html ,根据自身的操作系统选择要下载的二进制文件。
sqlite下载
libtiff:https://download.osgeo.org/libtiff/,我这里选择的是4.6.0版本。
proj:https://proj.org/en/9.3/download.html。
gdal:https://download.osgeo.org/gdal/,我下载的是3.8.2版本。
以上源码包已经上传,以上链接访问不了的可以直接下载:下载gdal相关源码包

Step.2 编译Sqlite

2.1 将之前下载的sqlite的三个压缩包全部解压到一个目录下。
解压sqlite

2.1 在vs中新建一个名为SqliteCompile的空项目,将sqlite3.c和sqlite3.def文件导入源文件,将sqlite3.h和sqlite3ext.h导入头文件。
vs创建空项目
2.3 配置项目属性:
(1)配置平台和生成的目标类型(lib静态库)
配置项目属性1
(2)配置预处理器定义:
配置预处理器定义
在预处理器定义中填入以下配置:

_USRDLL
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_ENABLE_FTS5
SQLITE_ENABLE_UNLOCK_NOTIFY

(3)设置模块定义文件:
设置模块定义文件
(4)编辑模块定义文件,在sqlite3.def文件后添加 sqlite3_unlock_notify:
编辑模块定义文件
(5)生成Release静态库:
生成Release静态库
可以在项目目录中看到已经生成了lib静态库:
生成的lib静态库
(6)拷贝文件至指定目录:在sqlite的成品目录下新建bin, lib, include三个目录,bin目录放入解压的exe可执行文件,include目录中放入.h头文件,lib目录中放入上一步生成的lib库文件:
拷贝文件

Step.3 编译libtiff

(1)将之前下载的libtiff源码包解压
(2)打开CMake,输入源码目录和build目录(libtiff源码目录下的build目录),点击Configure按钮。
编译libtiff CMake配置
(3)配置vs的版本和生成的平台,配置好之后点击Finish,然后点击主界面的Configure:
在这里插入图片描述
(4)输出框打印了Configuring done即说明配置成功了,可以修改安装libtiff的路径,搜索框中搜索“CMAKE_INSTALL_PREFIX”,设置安装路径,之后点击Generate生成文件:
配置生成路径
生成成功打印“Generating done”,这时可以在build目录中看到生成了vs的项目文件,点击“Open Project”按钮打开文件:
生成的vs解决方案文件
打开项目文件
(5)在VS中设置生成Release版本及平台(和之前的sqlite保持一致,后面的编译过程也是如此),生成ALL_BUILD和INSTALL两个项目,生成成功后在之前CMAKE设置的“CMAKE_INSTALL_PREFIX”路径下可以看到生成的文件。
生成libtiff
生成的libtiff文件

Step.4 编译proj

(1)将下载的proj源码包解压,打开CMake,选择源码目录和build目录(在proj源码目录下新建build目录),设置完成后点击Configure按钮,设置vs版本和生成的平台:
在这里插入图片描述
(2)生成过程中会报错,查看日志是因为没有找到sqlite3,这里搜索SQLITE3配置项,设置sqlite3的include目录、lib文件和可执行文件,顺便再把生成目标文件的目录一并设置了,设置好之后再次点击Configure:
设置sqlite3相关路径
设置proj的生成目标路径
(3)配置后还是报错,查看日志发现找不到TIFF,这里参考上一个步骤的方法搜索TIFF相关的配置,配置libtiff的include目录和lib路径,配置后再次Configure:
配置tiff的路径
(4)配置完成后还是报错,日志中打印缺少Curl,这里可以取消ENABLE_CURL的勾选使其不依赖curl,再次Configure。另外,如果本地访问不了github的话会报拉取代码失败的错误,这时可以取消BUILD_TESTING选项的勾选。
在这里插入图片描述
在这里插入图片描述
(5)还是报错“projsync requires Curl”,因为我们没有编译Curl,而projsync依赖Curl,自然配置projsync也就失败了,这里可以去掉BUILD_PROJSYNC的选项
在这里插入图片描述
(6)打印Configuring done即说明配置完成,再点击Generate按钮生成项目文件,打印“Generating done”即说明生成成功:
在这里插入图片描述
(7)点击打开项目按钮,在vs中设置生成Release版本,选择正确的平台,生成ALL_BUILD和INSTALL两个项目,生成成功后在之前设置的“CMAKE_INSTALL_PREFIX”路径下生成了PROJ相关的文件:

在这里插入图片描述
在这里插入图片描述
至此,编译proj的前序工作就完成了,下面就可以开始编译gdal了。

[TIPS] CMake输入参数时建议不要直接复制到文本框,最好使用选择目录活文件的方式填入,编译proj的时候由于CMake配置目录的斜杠与反斜杠问题导致一个模块编译失败,定位了很久。

Step.5 编译gdal

(1)解压下载的gdal源码包,在解压后gdal的跟路径下创建build目录用于存放CMake生成的临时文件。打开CMake,选择源码目录和build目录。
在这里插入图片描述
(2)点击Configure,设置平台类型和vs的版本后进行配置,发现报找不到PROJ的错误,配置proj的路径和生成二进制的路径,再点击配置。
配置proj
配置输出路径
(3)稍等片刻后会出现Configuring done,这里一定要注意,虽然Configure完成了,但是我们并没有配置tiff和sqlite的依赖,后面在编译和开发的时候大概率会有问题,所以这里把sqlite和tiff的路径给配置上,当然,这里有很多其他的配置项,后面有时间研究一下对应的功能。
配置tiff配置sqlite
(4)配置完之后点击Generate生成项目文件,然后点击打开项目按钮。
在这里插入图片描述
(5)在vs中设置生成Release版本和平台类型,依次生成ALL_BUILD和INSTALL两个项目,生成成功后可以看到目标路径下生成了编译好的二进制文件和一些数据文件。
在这里插入图片描述
在这里插入图片描述

Step.6 环境验证

通过以上步骤在本地已经配置好了gdal,现在在vs中新建一个c++项目来简单验证一下可用性,这个代码的功能也很简单,就是先注册gdal然后加载一副图像,如果正常执行就说明配置正确。

#include <iostream>
#include <gdal.h>
#include <gdal_priv.h>
using namespace std;int main() {GDALDataset* poDataset;GDALAllRegister();poDataset = (GDALDataset*)GDALOpen("pic.tif", GA_ReadOnly);if (poDataset == NULL){cout << "GDAL Configure OK";}return 0;
}

在执行前还需要配置下头文件和库的目录,在项目的属性中分别配置编译gdal生成的include目录,lib目录和lib文件路径:
配置附加包含目录
配置附加库目录
配置依赖项
这样配置后还没完,因为依赖了一些资源文件,所以需要把依赖的资源文件添加到项目中。在解决方案管理器中添加gdal.dll,proj_9_3.dll,tiff.dll三个资源文件,每个资源文件右键设置属性,设置类型为复制文件。
设置资源文件类型
至此,gdal的开发环境搭建就ok了,就可以进行基于gdal的一些开发了,ENJOY!!!

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

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

相关文章

Kafka(七)可靠性

目录 1 可靠的数据传递1.1 Kafka的可靠性保证1.2 复制1.3 Broker配置1.3.1 复制系数1.3.2 broker的位置分布1.3.3 不彻底的首领选举1.3.4 最少同步副本1.3.5 保持副本同步1.3.6 持久化到磁盘flush.messages9223372036854775807flush.ms9223372036854775807 1.2 在可靠的系统中使…

Netty开篇——基础介绍与准备(一)

I/O篇 Netty的介绍 Netty 是由JBOSS提供的一个Java开源框架在Github上Netty 是一个异步的、基于事件驱动的网络应用框架&#xff0c;用以快速开发高性能、高可靠性的网络IO程序。Netty 主要针对在TCP协议下面向客户端的高并发应用&#xff0c;或者Peer-to-Peer/P2P场景下的大量…

day17 平衡二叉树 二叉树的所有路径 左叶子之和

题目1&#xff1a;110 平衡二叉树 题目链接&#xff1a;110 平衡二叉树 题意 判断二叉树是否为平衡二叉树&#xff08;每个节点的左右两个子树的高度差绝对值不超过1&#xff09; 递归遍历 递归三部曲 1&#xff09;确定递归函数的参数和返回值 2&#xff09;确定终止条…

数据结构链表完整实现(负完整代码)

文章目录 前言引入1、链表定义及结构链表的分类3、单向不带头链表实现实现完整代码 4、带头双向循环链表实现实现完整代码 前言 引入 在上一篇文章中&#xff0c;我们认识了顺序表&#xff0c;但是在许多情况中&#xff0c;顺序表在处理一些事件时还存在许多问题&#xff0c;比…

鸿鹄电子招投标系统:企业战略布局下的采购寻源解决方案

在数字化采购领域&#xff0c;企业需要一个高效、透明和规范的管理系统。通过采用Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;我们打造了全过程数字化采购管理平台。该平台具备内外协同的能力&#xff0c;通过待办消息、招标公告、中标公告和信息发布等功能模块…

数据分析——快递电商

一、任务目标 1、任务 总体目的——对账 本项目解决同时使用多个快递发货&#xff0c;部分隔离区域出现不同程度涨价等情形下&#xff0c;如何快速准确核对账单的问题。 1、在订单表中新增一列【运费差异核对】来表示订单运费实际有多少差异&#xff0c;结果为数值。 2、将…

【无标题】关于异常处理容易犯的错

一般项目是方法打上 try…catch…捕获所有异常记录日志&#xff0c;有些会使用 AOP 来进行类似的“统一异常处理”。 其实&#xff0c;这种处理异常的方式非常不可取。那么今天&#xff0c;我就和你分享下不可取的原因、与异常处理相关的坑和最佳实践。 捕获和处理异常容易犯…

Feature Fusion for Online Mutual KD

paper&#xff1a;Feature Fusion for Online Mutual Knowledge Distillation official implementation&#xff1a;https://github.com/Jangho-Kim/FFL-pytorch 本文的创新点 本文提出了一个名为特征融合学习&#xff08;Feature Fusion Learning, FFL&#xff09;的框架&…

行走在深度学习的幻觉中:问题缘由与解决方案

如何解决大模型的「幻觉」问题&#xff1f; 我们在使用深度学习大模型如LLM&#xff08;Large Language Models&#xff09;时&#xff0c;可能会遇到一种被称为“幻觉”的现象。没错&#xff0c;它并不是人脑中的错觉&#xff0c;而是模型对特定模式的过度依赖&#xff0c;这…

Linux---gcc编译

目录 前言 一、gcc编译 二、程序的编译过程 三、gcc查看编译过程 1.预处理阶段 2.编译 3.汇编 4.链接 动静态库链接的内容 动静态库链接的优缺点 5.总结记忆 前言 在前面我们学会使用vim对文件进行编辑&#xff0c;如果是C或者C程序&#xff0c;我们编辑好了内容…

【DDR】基于Verilog的DDR控制器的简单实现(一)——初始化

在FPGA中&#xff0c;大规模数据的存储常常会用到DDR。为了方便用户使用&#xff0c;Xilinx提供了DDR MIG IP核&#xff0c;用户能够通过AXI接口进行DDR的读写访问&#xff0c;然而MIG内部自动实现了许多环节&#xff0c;不利于用户深入理解DDR的底层逻辑。 本文以美光(Micro…

【算法刷题】Day28

文章目录 1. 买卖股票的最佳时机 III题干&#xff1a;算法原理&#xff1a;1. 状态表示&#xff1a;2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码&#xff1a; 2. Z 字形变换题干&#xff1a;算法原理&#xff1a;1. 模拟2. 找规律 代码&#xff1a; 1. 买卖股票的最佳时…

重学Java 4 进制转换和位运算

天赋不好好使用的话&#xff0c;可是会被收回的哦 ——24.1.13 一、进制转换 1.常用的进制 2.十进制和二进制之间的转换 1.十进制转二进制 辗转相除法——循环除以2&#xff0c;取余数&#xff0c;除到商为0为止&#xff0c;除完后&#xff0c;由下往上&#xff0c;得出换算后…

JVM基础(7)——ParNew垃圾回收器

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

Kafka(四)Broker

目录 1 配置Broker1.1 Broker的配置broker.id0listererszookeeper.connectlog.dirslog.dir/tmp/kafka-logsnum.recovery.threads.per.data.dir1auto.create.topics.enabletrueauto.leader.rebalance.enabletrue, leader.imbalance.check.interval.seconds300, leader.imbalance…

Redis之集群方案比较

哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态&#xff0c;如果master节点异常&#xff0c;则会做主从切换&#xff0c;将某一台slave作为master&#xff0c;哨兵的配置略微复杂&#xff0c;并且性能和高可用性等各方面表现一般&a…

Node.js和npm

目录 01_Node.js01.什么是 Node.js目标讲解小结 02.fs模块-读写文件目标讲解小结 03.path模块-路径处理目标讲解小结 04.案例-压缩前端html目标讲解小结 05.认识URL中的端口号目标讲解小结 06.http模块-创建Web服务目标讲解小结 07.案例-浏览时钟目标讲解小结 02_Node.js模块化…

【LabVIEW FPGA入门】使用CompactRIO进行SPI和I2C通信

NI提供了 SPI and I2C Driver API&#xff1a;下载SPI and I2C Driver API - NI 该API使用FPGA数字I / O线与SPI或I2C设备进行通信。 选择数字硬件时&#xff0c;要考虑三个选项&#xff1a; NI Single-Board RIO硬件可同时使用SPI和I2C驱动程序。NI 9401 C系列模块与SPI驱动程…

LINUX网络

一、网络配置命令 1.1 ifconfig 命令功能ifconfig默认显示活动的显卡ifconfig -a显示所有的网卡ifconfig 网卡名称只显示前面的网卡信息ifconfig 网卡 down/ifdown 网卡关闭网卡ifconfig 网卡 up/ifup 网卡开启网卡ifconfig ens33:0 IP地址/子网掩码设置虚拟网卡 TYPEEthernet…

如何使用创建时间给文件重命名,简单的批量操作教程

在处理大量文件时&#xff0c;有时要按照规则对文件重命名&#xff0c;根据文件的创建时间来重命名。那如何批量操作呢&#xff1f;现在一起来看云炫文件管理器如何用文件的创建时间来批量重命名。 按创建时间重命名文件的前后对比图。 用创建时间批量给文件重命名的步骤&…