Win11+VS2022编译GDAL3.7.1

一、编译前准备

1.编译GDAL库之前需先编译 SQLite、TIFF、PROJ这几个依赖库。

 2.各编译环境对应版本下载:

软件版本下载地址
Visual Studio2022下载链接
SQLite3.42.0下载链接
CMake3.26.3下载链接
TIFF4.5.0下载链接
PROJ9.2.0下载链接

3.为方便后续使用下载后解压可组织目录如下(仅供参考),下述文件中的【MyGDALProject】为建立的VS2022 C++工程(配置SQLite需要)。

二、编译SQLite

编译方法参照:Win11下基于VS2022编译SQLite3源码_sqlite源码编译_GIS子枫的博客-CSDN博客

提示:编译时为保证成功率请均“以管理员身份运行”进行各步骤的编译操作。

三、编译TIFF4.5.0

编译方法参照:Win11下基于VS2022编译SQLite3源码_sqlite源码编译_GIS子枫的博客-CSDN博客Win11下基于cmake-3.26.3 完美编译 TIFF-4.5.0源码_tiff编译_GIS子枫的博客-CSDN博客Win11下基于VS2022编译SQLite3源码_sqlite源码编译_GIS子枫的博客-CSDN博客

提示:编译时为保证成功率请均“以管理员身份运行”进行各步骤的编译操作。

编译成功会生成四个文件,具体如下图所示,我的是默认生成在C盘" C:\Program Files (x86)\tiff "目录下。

四、编译PROJ9.2.0

编译方法参照:Win11下基于cmake-3.26.3 完美编译 TIFF-4.5.0源码_tiff编译_GIS子枫的博客-CSDN博客Win11下基于cmake-3.26.3 完美编译 TIFF-4.5.0源码_tiff编译_GIS子枫的博客-CSDN博客Win11下基于cmake-3.26.3 完美编译 TIFF-4.5.0源码_tiff编译_GIS子枫的博客-CSDN博客

提示:编译时为保证成功率请均“以管理员身份运行”进行各步骤的编译操作。

编译成功会生成四个文件,具体如下图所示,我的是默认生成在C盘" C:\Program Files (x86)\PROJ "目录下。

 完成上述三个环境的配置编译后,即可编译GDAL库了。

五、编译GDAL3.7.1

GDAL库的编译,仍参照下属博文:Win11下 基于VS2022编译GDAL库_gdal编译好的库_GIS子枫的博客-CSDN博客

这里因GDAL3.7.1版本无" nmake.opt "文件,故采用上述博文中的第二种编译方法,即通过CMake进行编译。

1.打开CMake

     (1)找到安装的CMake软件,打开【bin】文件夹下的【cmake-gui.exe】,右键“以管理员身份运行”。

    (2)若在上述配置SQLite和TIFF时使用过CMake进行编译,再次运行CMake会存有上次运行记录,此时可通过点击【File】-【Delete Cache】删除缓存即可。

     (3)在存放gdal解压文件的目录下(即gdal3.7.1文件夹同级目录下)新建文件夹,命名为“build”,文件夹组织如下:

    (4)点击【Browse Source...】添加源代码路径,即gdal3.7.1加压后存放的路径,然后点击【Browse Build...】添加生成代码路径,并勾选【Grouped】和【Advanced】具体如下:

   (5)添加完路径后,点击【Configure】,在弹出的窗口中修改【Specify the generator for this project】参数为:Visual Studio 17 2022;【Optional platform for generator】参数默认为:X64,若电脑为64位可不选择,其他请选择对应参数即可。不出意外执行日志会报错,原因是没有添加<PROJ>和<TIFF> 的对应参数。

 (6)在上述执行的结果中添加PROJ库和TIFF库的路径。

PROJ库的路径修改如下:

      1)【PROJ DIR】的Value值改为前面PROJ库编译生成文件的存放路径。如:C:\Program Files (x86)\PROJ

      2)【PROJ INCLUDE DIR】的Value值改为前面PROJ库编译生成的include文件路径。如:C:\Program Files (x86)\PROJ\include

      3)【PROJ LIBRARY RELEASE】的Value值改为前面PROJ库编译生成的lib文件下的proj.lib 文件。如:C:\Program Files (x86)\PROJ\lib\proj.lib

修改位置如下图所示,图引自下述链接。Win11下 基于VS2022编译GDAL库_gdal编译好的库_GIS子枫的博客-CSDN博客

因编译生成的均为release,故只修改了对应的PROJ_LIBRARY_RELEASE,而未修改DEBUG对应的值,如若生成的为debug,请灵活修改PROJ_LIBRARY_DEBUG的值即可。

 TIFF库的路径修改如下:

      1)【TIFF INCLUDE DIR】的Value值改为前面TIFF库编译生成的include文件的存放路径。如:C:\Program Files (x86)\tiff\include

      2)【TIFFLIBRARY RELEASE】的Value值改为前面TIFF库编译生成的lib文件下的tiff.lib 文件。如:C:\Program Files (x86)\TIFF\lib\tiff.lib

因编译生成的均为release,故只修改了对应的TIFF_LIBRARY_RELEASE,而未修改DEBUG对应的值,如若生成的为debug,请灵活修改TIFF_LIBRARY_DEBUG的值即可。

   (7)后续步骤参照下述博文中的对应后续步骤操作即可。

Win11下 基于VS2022编译GDAL库_gdal编译好的库_GIS子枫的博客-CSDN博客

六、应用测试运行

(1)上述步骤全部编译成功后,首先进行环境配置

1)配置环境变量

在系统变量中分别添加TIFF、PROJ、GDAL的bin路径。选择【此电脑】右键-【属性】-【高级系统设置】-【环境变量】-【编辑】:如下

 

 在弹出的编辑环境变量中分别新建下述三个环境变量,其中bin路径即为各项依赖库编译成功生成的文件路径。

 2)拷贝dll类库至系统环境中

 分别找到TIFF、PROJ、GDAL编译生成的gdal.dll、tiff.dll、proj_9_2.dll,将此三个文件拷贝至:”“C:\Windows\System32”路径下。

 拷贝完成如下图所示:

3)上述步骤配置完成请重启电脑。否则后续应用测试运行时,会报:找不到gdal.dll等错误。

(2)然后配置VS2022中的gdal环境

以管理员身份运行VS2022;

1)新建空白C++ windows项目-【头文件】-右键【添加】选择【现有项】,如下:

 2)【解决方案管理器中】选择项目名称-右键选择【属性】打开项目属性页。选择【VC++目录】-【包含目录】,分别添加gdal库的include路径和lib路径。如下图:

然后选择【链接器】 -【附加依赖项】-编辑添加编译生成的gdal库中的lib文件名-点击【应用】-【确定】即可。(我的gdal库中的lib文件名为:gdal.lib)如下:

(3)测试应用代码

 代码引自:C++ GDAL批量读取栅格文件并生成像元在不同文件中的时间序列数组 (baidu.com)

#include <iostream>
#include <vector>
#include <io.h>
#include "gdal_priv.h"

using namespace std;

void get_need_file(string path, vector<string>&file, string ext);

int main() {
    string file_path = R"(E:\02_Project\02_ChlorophyllProduce\01_Data\00_Test)";
    vector<string> my_file;
    string need_extension = ".bmp";
    get_need_file(file_path, my_file, need_extension);
    int file_size = my_file.size();
    if (file_size == 0)
	{
		cout << "No file can be found!" << endl;
	}
	else
	{
		cout << "Find " << file_size << " file(s).\n" << endl;
	}
	
	int nXSize, nYSize;
	float** pafScanline = new float* [file_size];
	int pic_index = 1;
	for (auto x : my_file)
	{
		     GDALDataset * poDataset;
		     GDALAllRegister();
		     CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
		     poDataset = (GDALDataset*)GDALOpen(x.c_str(), GA_ReadOnly);
		     if (poDataset == NULL)
		     {
			    cout << "Open File " << x << " Error!" << endl;
			 }
		     else
			 {
			    cout << "Open File " << x << " Success!" << endl;
		     }
	
			GDALRasterBand * poBand;
		    poBand = poDataset->GetRasterBand(1);
		    nXSize = poBand->GetXSize();
		    nYSize = poBand->GetYSize();
	        cout << nXSize << "," << nYSize << "\n" << endl;
		    pafScanline[pic_index - 1] = new float[nXSize * nYSize];
		    poBand->RasterIO(GF_Read, 0, 0, nXSize, nYSize, pafScanline[pic_index - 1], nXSize, nYSize, GDT_Float32, 0, 0);
		
		    pic_index++;
	}
	
    float** pixel_paf = new float* [nXSize * nYSize];
	    for (int pixel_num = 0; pixel_num < nXSize * nYSize; pixel_num++)
		    {
		        pixel_paf[pixel_num] = new float[file_size];
		       for (int time_num = 0; time_num < file_size; time_num++)
			        {
			            pixel_paf[pixel_num][time_num] = pafScanline[time_num][pixel_num];
			        }
		   }

		    for (int i = 0; i < file_size; i++)
		    {
		        cout << pixel_paf[0][i] << "," << endl;
		    }
	
		    delete[] pafScanline;
	    delete[] pixel_paf;
	    pafScanline = NULL;
	   pixel_paf = NULL;
	
		    return 0;
	
}

void get_need_file(string path, vector<string>&file, string ext)
{
	    intptr_t file_handle = 0;
	   struct _finddata_t file_info;
	    string temp;
	    if ((file_handle = _findfirst(temp.assign(path).append("/*" + ext).c_str(), &file_info)) != -1)
		    {
		        do
			        {
			            file.push_back(temp.assign(path).append("/").append(file_info.name));
			       } while (_findnext(file_handle, &file_info) == 0);
			        _findclose(file_handle);
			  }
	}

复制粘贴上述代码至“main.cpp”中,点击运行即可。如下:

运行结果如下,即表示win11+VS2022+GDAL的所有编译配置已成功。

PS:特别感谢文中所引用博文的各位博主,转载请注明出处,谢谢~,欢迎在评论区交流探讨。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值