【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!!!

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

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

相关文章

白嫖aws创建Joplin server服务器

网上有很多的Joplin服务器的搭建教程&#xff0c;但是基本都是抄来抄去&#xff0c;对初学者实在是太不友好了。 话不多说&#xff0c;说干就干&#xff0c;自己从头找资料搭了一个&#xff0c;这可能是全网最好的Joplin服务器搭建教程了。 aws服务器 aws的服务器还是很香的&…

idea git回滚之前提交记录

提交代码时&#xff0c;如果不小心提交了不需要提交的内容&#xff0c;在本地仓库中&#xff0c;此时需要回滚版本&#xff0c;如何回滚 1.打开git控制台&#xff0c;左下角git,选择要处理的分支&#xff0c;选择刷新获取最新git提交记录 2&#xff09;选中自己commit需要回滚…

Fluids —— Minimal fluid setups

目录 Waterline FLIP Boundary Boundary flow 创建流体设置的三个基本方法&#xff1b; Waterline 由FLIP Container SOP与FLIP Solver SOP组成的基本network&#xff0c;可不需要任何外部源&#xff1b; FLIP Container SOP&#xff0c;能使用不同的容器形状&#xff1b;F…

PiflowX-MysqlCdc组件

MysqlCdc组件 组件说明 MySQL CDC连接器允许从MySQL数据库读取快照数据和增量数据。 计算引擎 flink 组件分组 cdc 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子hostnameHostname“”无是MySQL…

MySql -数据库基本概念

一、数据库的基本概念 1.为什么要学数据库&#xff1f; 之前我们如果想将一些数据实现永久化存储&#xff0c;可以怎么做呢&#xff1f;没错。使用IO流的技术将数据保存到本地文件中但是接下来我有这样一个需求&#xff1a;将下面的user.txt文件中的王五年龄修改为35 张三 2…

leetcode 动态规划(最后一块石头的重量II、目标和、一和零)

1049.最后一块石头的重量II 力扣题目链接(opens new window) 题目难度&#xff1a;中等 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < …

Go语言学习笔记(三)

教程&#xff1a;文档 - Go 编程语言 (studygolang.com) 调用模块代码 在call-module-code需要注意&#xff0c;需要在hello目录下操作 go mod edit -replace example.com/greetings../greetings 这是一个在Go项目的模块管理中的命令。在Go的模块管理工具&#xff08;go mod&…

SpringBoot-admin健康监控

监控-健康监控服务 目的&#xff1a;能够理解健康监控actuator的作用 背景&#xff1a; 在一些大型的业务应用中&#xff0c;工程会根据业务模块做微服务拆分&#xff0c;后期每一个微服务在云上部署以后&#xff0c;都需要对其进行监控、追踪、审计、控制等操纵&#xff0c…

chatglm3的api调用

conda activate chatglm3 cd openai_api_demo python openai_api.py 启动ok&#xff0c;然后内网映射后 anaconda启动jupyter !pip install openai1.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple/ """ This script is an example of using the OpenAI …

人工智能复习

机器学习中线性回归和逻辑回归&#xff1a; 机器学习的分类&#xff1a; 监督学习和无监督学习&#xff0c;半监督学习 监督学习&#xff08;Supervised Learning&#xff09;&#xff1a; 监督学习是一种利用带有标签&#xff08;标记&#xff09;的数据进行训练的机器学习…

【学习总结】地面路谱分析

本文仅用于记录自己的学习总结&#xff0c;包括个人理解。不保证内容严格正确。 0. 参考资料 [1] 国标GB/T 703-2005/ISO 8608:1995。[2] Bilibili-车辆考研-路面不平度统计特性[3] Bilibili-清华大学《汽车理论》[4] 网络参考文档.[5] 论文&#xff1a;高雄《路面不平度统计…

什么是Helm?它是如何提升云原生应用私有化部署效率的

转载至我的博客 &#xff0c;公众号&#xff1a;架构成长指南 试想一下&#xff0c;如果有一个项目有50 个微服务&#xff0c;每个微服务都有service、deployment、ingress、pvc等 yaml 文件&#xff0c;算下来大概有 200 个文件&#xff0c;然后这个项目需要基于k8s进行私有化…

强化学习求解TSP(四):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…

Vue3-41-组件- 动态组件 component 标签 和 is 属性 的使用

说明 <component> 标签 有一个 is 属性&#xff0c; 可以给这个 is属性 赋值为一个 组件对象&#xff0c; 这样这个<component> 标签就可以渲染指定的组件对象了。 使用案例 本案例中会 准备两个简单的组件&#xff0c; 在 App.vue 中导入这两个组件&#xff0c;并…

C#入门篇(一)

变量 顾名思义就是变化的容器&#xff0c;即可以用来存放各种不同类型数值的一个容器 折叠代码 第一步&#xff1a;#region 第二步&#xff1a;按tab键 14种数据类型 有符号的数据类型 sbyte&#xff1a;-128~127 short&#xff1a;-32768~32767 int&#xff1a;-21亿多~21亿多…

VMware Visio OmniGraffle模板和图标

VMware Visio OmniGraffle模板和图标 包含可用于Visio、omnigraffle的图标和SVG矢量图。 简介 这组资源适用于 IT 管理员、系统架构师、网络工程师和其他需要可视化 VMware 基础架构的专业人士创建精确的 VMware 网络和数据中心部署图&#xff0c;通过使用这些模板和图标&am…

css三大特性

css 三大特性 一、层叠性&#xff1a;css样式冲突采取原则&#xff08;后者覆盖前者&#xff09; 二、继承性&#xff1a;对于部分属性样式会有天生的继承 &#xff08;1&#xff09;字体系列属性 font-family&#xff1a;字体系列 font-weight&#xff1a;字体的粗细 fon…

ai中的渐变怎么使用

Adobe Illustrator 是Adobe系统公司推出的基于矢量的图形制作软件&#xff0c;作为全球最著名的矢量图形软件&#xff0c;以其强大的功能和体贴用户的界面&#xff0c;已经占据了全球矢量编辑软件中的大部分份额。据不完全统计全球有37%的设计师在使用Adobe Illustrator进行艺术…

一键修复所有dll缺失的工具,dll修复工具下载使用教程

在计算机使用过程中&#xff0c;我们经常会遇到各种软件或系统错误提示&#xff0c;其中最常见的就是“找不到指定的模块”或“无法找到某某.dll文件”。Dll是动态链接库的缩写&#xff0c;它是Windows操作系统中的重要组成部分&#xff0c;负责提供各种功能和资源给应用程序使…

Kafka集群部署 (KRaft模式集群)

KRaft 模式是 Kafka 在 3.0 版本中引入的新模式。KRaft 模式使用了 Raft 共识算法来管理 Kafka 集群元数据。Raft 算法是一种分布式共识算法&#xff0c;具有高可用性、可扩展性和安全性等优势。 在 KRaft 模式下&#xff0c;Kafka 集群中的每个 Broker 都具有和 Zookeeper 类…