一、编译前准备
1.编译GDAL库之前需先编译 SQLite、TIFF、PROJ这几个依赖库。
2.各编译环境对应版本下载:
软件 | 版本 | 下载地址 |
---|---|---|
Visual Studio | 2022 | 下载链接 |
SQLite | 3.42.0 | 下载链接 |
CMake | 3.26.3 | 下载链接 |
TIFF | 4.5.0 | 下载链接 |
PROJ | 9.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:特别感谢文中所引用博文的各位博主,转载请注明出处,谢谢~,欢迎在评论区交流探讨。