chaoshu的个人博客分享 http://blog.sciencenet.cn/u/chaoshu

博文

基于VS2017的GDAL编译和调式

已有 562 次阅读 2019-11-9 21:13 |个人分类:GIS|系统分类:科研笔记

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)

image.png

将GDAL_HOME设置为想要存放安装GDAL的路径

为了调式源码需要,设置为GDAL源码同一路径!

image.png

如果是64位电脑修改如下,32位则不需要修改;

将#WIN64=YES改成WIN64=YES

image.png

保存!

3)以管理员身份运行适用于VS2017的X64的本机工具命令提示,并编译GDAL

适用于VS2017的X64的本机工具命令提示可以在开始菜单中找到,一定要以管理员身份运行。如果你的VS2017是英文版,请以管理员身份运行x64 Native Tools Command Prompt for VS 2017。

image.png

image.png

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库使用)

image.png

打开安装目录下的文件夹(代码修改的路径)有bin,data,html,lib,include几个文件夹则安装完成。

二、调式GDAL

Debug模式编译完成之后,应该会在gdal的源码目录中生成下面几个文件,如下图显示:

注意:第一次编译执行a)会需要一段时间, 这是正常的,生成的文件如果缺失或者大小不对,是不能够调式的,我之前就因为这里死都无法调式,检查了很久!如果你也不行的话,尝试下面语句从新运行a)

nmake -f makefile.vc MSVC_VER=1910 DEBUG=1 ANALYZE=1 WITH_PDB=1

image.png

时用到的文件主要就是pdb文件,请确保pdb文件存在,大小应该在30M以上说明是可以调试的(我实际编译生成有78M),有时候生成的pdb文件会小于10M,这时应该清理GDAL的工程,然后重新编译就好了。

下面开始建立VS2017工程项目调式GDAL

1)打开vs2017,新建一个  c++  控制台应用程序项目。然后通过属性管理器打开属性设置。

image.png

image.png

在VC++目录依次添加包含目录、库目录

image.png

image.png

再在链接器->输入->添加附加依赖项,手动输入gdal_i.lib    如下图所示:

image.png

依次点击应用->确定。至此,gdal在VS2017中配置成功了。

2)设置环境变量

依次点击计算机->属性->高级系统设置->环境变量->系统变量内的Path 

image.png

点击确定按钮,为了保险起见,此时应该将电脑重启,才能确保环境变量生效。

3)调试代码

重启电脑以后,打开项目,项目默认是x86的,我们改成x64

image.png

在主函数文件中添加如下代码:


#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的源码文件中。

image.png

如果GDAL的pdb文件在程序启动时没有加载,就不能进入GDAL的源码。判断是否加载GDAL的pdb文件,可以在VS的输出窗口中看到“gdal202.dll已加载符号”的字样就说明加载成功,可以调试,如下图所示。


image.png


参考:

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



http://blog.sciencenet.cn/blog-858128-1205509.html

上一篇:GNSS数据预处理软件
下一篇:GNSS后处理软件

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备14006957 )

GMT+8, 2019-12-12 00:05

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部