||
GDAL中已经没有了Visual Studio的工程文件sln,无法直接使用VS IDE进行编译了!
所以必须用命令方式进行编译,本文采用VS2017+gdal-2.2.3进行,要求电脑已经提前安装了VS2017。
一、编译GDAL
1)下载GDAL
下载相应版本的GDAL源代码,解压到一个路径下,比如本文:C:\Users\cugch\Downloads\\gdal-2.2.3
https://trac.osgeo.org/gdal/wiki/DownloadSource#a3.0.2LatestStableRelease-October2019
2)修改参数
找到解压目录中的nmake.opt文件,用文本编辑器打开该文件(本文使用notepad++),
该版本默认使用VS2008编译,所以将MSVC设置为1910(即为vs2017);
将GDAL_HOME设置为想要存放安装GDAL的路径
为了调式源码需要,设置为GDAL源码同一路径!
如果是64位电脑修改如下,32位则不需要修改;
将#WIN64=YES改成WIN64=YES
保存!
3)以管理员身份运行适用于VS2017的X64的本机工具命令提示,并编译GDAL
适用于VS2017的X64的本机工具命令提示可以在开始菜单中找到,一定要以管理员身份运行。如果你的VS2017是英文版,请以管理员身份运行x64 Native Tools Command Prompt for VS 2017。
CMD终端中运行:
cd C:\Users\cugch\Downloads\Google Download\gdal-2.2.3
nmake -f makefile.vc DEBUG=1
nmake /f makefile.vc install
nmake /f makefile.vc devinstall
代码说明:
a)以Debug模式编译GDAL库(如果不想调式,可以去掉DEBUG=1)
b)编译GDAL库,并安装(这里安装的意思就是将生成的dll,exe等文件拷贝到GDAL_HOME目录),
c)编译GDAL库,并安装开发者模式(安装的意思同上,开发者模式意思是将开发用的include文件夹中的头文件和lib文件一同拷贝到GDAL_HOME目录,此时会在GDAL_HOME目录中多出来两个文件夹,分别是include和lib,分别存放的是GDAL的头文件和lib文件,用于调用GDAL库使用)
打开安装目录下的文件夹(代码修改的路径)有bin,data,html,lib,include几个文件夹则安装完成。
二、调式GDAL
Debug模式编译完成之后,应该会在gdal的源码目录中生成下面几个文件,如下图显示:
注意:第一次编译执行a)会需要一段时间, 这是正常的,生成的文件如果缺失或者大小不对,是不能够调式的,我之前就因为这里死都无法调式,检查了很久!如果你也不行的话,尝试下面语句从新运行a)
nmake -f makefile.vc MSVC_VER=1910 DEBUG=1 ANALYZE=1 WITH_PDB=1
时用到的文件主要就是pdb文件,请确保pdb文件存在,大小应该在30M以上说明是可以调试的(我实际编译生成有78M),有时候生成的pdb文件会小于10M,这时应该清理GDAL的工程,然后重新编译就好了。
下面开始建立VS2017工程项目调式GDAL
1)打开vs2017,新建一个 c++ 控制台应用程序项目。然后通过属性管理器打开属性设置。
在VC++目录依次添加包含目录、库目录
再在链接器->输入->添加附加依赖项,手动输入gdal_i.lib 如下图所示:
依次点击应用->确定。至此,gdal在VS2017中配置成功了。
2)设置环境变量
依次点击计算机->属性->高级系统设置->环境变量->系统变量内的Path
点击确定按钮,为了保险起见,此时应该将电脑重启,才能确保环境变量生效。
3)调试代码
重启电脑以后,打开项目,项目默认是x86的,我们改成x64
在主函数文件中添加如下代码:
#include "pch.h"
#include <gdal_priv.h>
#include <ogrsf_frmts.h>
#include <iostream>
using namespace std;
int main()
{
GDALAllRegister();
GDALDataset *poDS;
CPLSetConfigOption("SHAPE_ENCODING", ""); //解决中文乱码问题
//读取shp文件
poDS = (GDALDataset*)GDALOpenEx("core.shp", GDAL_OF_VECTOR, NULL, NULL, NULL);
if (poDS == NULL)
{
printf("Open failed.\n%s");
return 0;
}
OGRLayer *poLayer;
poLayer = poDS->GetLayer(0); //读取层
OGRFeature *poFeature;
poLayer->ResetReading();
int i = 0;
while ((poFeature = poLayer->GetNextFeature()) != NULL)
{
//if (poFeature->GetFieldAsDouble("AREA") < 1) continue; //去掉面积过小的polygon
i = i++;
cout << i << " ";
OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
int iField;
int n = poFDefn->GetFieldCount(); //获得字段的数目,不包括前两个字段(FID,Shape);
for (iField = 0; iField < n; iField++)
{
//输出每个字段的值
cout << poFeature->GetFieldAsString(iField) << " ";
}
cout << endl;
OGRFeature::DestroyFeature(poFeature);
}
GDALClose(poDS);
system("pause");
return 1;
}
点击“生成”,项目中生成Debug目录,将.dll、.pdb等文件拷贝至你的测试工程中的exe所在目录(注意是x64下面的Debug),然后使用调试方式启动程序,在程序调用GDAL库中的函数时,按F11键应该就可以进入GDAL的源码文件中。
如果GDAL的pdb文件在程序启动时没有加载,就不能进入GDAL的源码。判断是否加载GDAL的pdb文件,可以在VS的输出窗口中看到“gdal202.dll已加载符号”的字样就说明加载成功,可以调试,如下图所示。
参考:
https://blog.csdn.net/qq_32153213/article/details/81363588
https://blog.csdn.net/u010963435/article/details/84799540
https://www.cnblogs.com/bigbigtree/archive/2011/11/20/2256434.html
https://blog.csdn.net/liminlu0314/article/details/9427263
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2025-1-11 02:19
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社