VS2017编译GDAL常见问题

  • Post author:
  • Post category:其他




1、下载解压GDAL

官方下载地址为https://trac.osgeo.org/gdal/wiki/DownloadSource,我下载的版本是gdal-2.3.2。需要新建一个安装目录,我的安装地址在D:\GDAL\gdal上。解压地址是D:\GDAL\gdal-2.3.2。



2、编译安装GDAL



1、修改源代码

找到解压地址D:\GDAL\gdal-2.3.2中的文件nmake.opt,用notepad++打开,更改如下几行,并保存:

  • 第41行的代码修改为:MSVC_VER=1910

    在这里插入图片描述
  • 第57行的代码修改为:GDAL_HOME = “D:\GDAL\gdal”

    在这里插入图片描述
  • 修改第184行的代码:原来为# WIN64=YES修改为WIN64=YES

    在这里插入图片描述



2、编译

以管理员身份运行x64 Native Tools Command Prompt for VS 2017(

VS2017的X64的本机工具命令提示



位置:键盘Win(或者桌面”开始”按钮)——所有程序——Visual Studio 2017——Visual Studio Tools——VC——x64 Native Tools Command Prompt for VS 2017

在这里插入图片描述

在命令行输入(参考链接)(

https://www.jianshu.com/p/bfbf2bec954c

):

cd D:\GDAL\gdal-2.3.2

nmake /f

makefile.vc

MSVC_VER=1910 WIN64=yes

nmake /f

makefile.vc

install MSVC_VER=1910 WIN64=yes

nmake /f

makefile.vc

devinstall MSVC_VER=1910 WIN64=yes

关于为什么要写MSVC_VER=1910 WIN64=yes,MSVC_VER=1910表示VS2017 ,WIN64=yes表示64位。



3、GDAL问题



1、‘nmake’ 不是内部或外部命令,也不是可运行的程序

在这里插入图片描述

这是因为你的环境变量没有配置,需要添加path include lib。

计算机——右键属性——高级系统设置——环境变量。如下图

在这里插入图片描述

我的vs2017安装目录在D盘下,并按照这篇文章

手动配置环境变量

:(

https://blog.csdn.net/kaige_zhao/article/details/80315697

)

  • 在gcc的用户变量新建path,添加:

  • D:\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\Hostx86\x86;
  • 在gcc的用户变量新建Include,添加:

  • D:\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include; C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\ucrt;
  • 在gcc的用户变量新建lib,添加:

  • D:\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\lib\x86; C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10586.0\ucrt\x86; C:\Program Files (x86)\Windows Kits\8.1\bin\x86



    如果没用,尝试自动配置环境变量:
  • 找到计算机中批处理文件vcvarsall.bat的位置,运行该文件:
  • 该文件的地址:

    D:\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
  • 在命令行输入:
  • cd D:\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
  • vcvarsall.bat amd64


解释:如果要在命令行生成 32位代码,就执行vcvarsall x86

如果要在32位系统下生成64位代码,就执行vcvarsall x86_amd64

如果要在64位系统下生成32位代码,就执行vcvarsall x86或vcvarsall amd64_x86



通过在纯“命令提示符”窗口中运行 vcvarsall.bat,可设置环境变量以配置适用于 32 位或 64 位本机编译的命令行,或适用于面向 x86、x64 或 ARM 处理器的交叉编译的命令行。 如果未提供任何参数,vcvarsall.bat 将配置环境变量以供使用面向 x86 的 32 位本机编译器。 但是,你可以用该编译器来配置所有的编译器。 如果指定在生成计算机体系结构上未安装或不可用的编译器配置,将会显示一条消息。 下表显示了支持的参数。


在这里插入图片描述



或者在命令行运行这个文件,2017以后才有的:VsDevCmd.bat



2、‘xcopy’ 不是内部或外部命令,也不是可运行的程序

在这里插入图片描述

找到计算机中xcopy.exe的位置,双击环境变量path参数为其设置(不一定要删除原有的,可以添加多个)增加变量值“c:\windows\system32”,分号隔开。


还比如’rc’ 不是内部或外部命令,也不是可运行的程序:


RC.exe:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin


也是将上面地址添加到path中。



3、无法打开包括文件:“stdio.h”: No such file or directory

这类问题还有很多,比如:

  • 无法打开包括文件:“stdio.h”: No such file or directory
  • 无法打开包括文件:“window.h”: No such file or directory
  • 无法打开包括文件:“winapifamily.h”: No such file or directory

    原因:这些头文件所在的文件夹索引地址没有加到环境变量的Include中。

    解决方法:添加地址到Include中。

    地址:
  • stdio.h

    C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\ucrt;
  • window.h

    C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\um;
  • winapifamily.h

    C:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\shared



4、cannot open output file “odbc32.lib”

解决方法:对于lib文件的,添加地址到环境变量Lib中。

地址:

  • odbc32.lib

    C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\x64



5、INK : error LNK2001: 无法解析的外部符号 OGRFeatureStylePuller

在这里插入图片描述

这个问题困扰了我一天,我试过的几个命令提示符,包括:

x86 Native Tools Command Prompt for VS 2017(无法解析的外部符号)

Developer Command Prompt for VS 2017(无法解析的外部符号)

VS 2015开发人员命令提示(无法解析的外部符号)

x86 Native Tools Command Prompt for VS 2015(无法解析的外部符号)

x64 Native Tools Command Prompt for VS 2015(模块计算机类型“X64”与目标计算机类型“X86”冲突)

x64 Native Tools Command Prompt for VS 2017(模块计算机类型“X64”与目标计算机类型“X86”冲突)

后来我想了要避免模块计算机类型“X64”与目标计算机类型“X86”冲突,就要安装GDAL WIN32类型的,所以在nmake.bat中的 #WIN64不改为WIN64,环境变量path include中路径有x64的改为 x86, vs2017 属性为x86(具体更改步骤见节6)

在 x86 Native Tools Command Prompt for VS 2017中写下命令:

cd D:\GDAL\gdal-2.3.2

nmake /f

makefile.vc

MSVC_VER=1910

nmake /f

makefile.vc

install MSVC_VER=1910

nmake /f

makefile.vc

devinstall MSVC_VER=1910

就成功了



6、模块计算机类型“X64”与目标计算机类型“X86”冲突

因为操作系统是64位的,想安装GDAL的WIN64版本,而vs2017上c++文件的属性中的目标计算机是x86的,表示的是用x64系统写x86代码。所以运行就会出现模块计算机类型“X64”与目标计算机类型“X86”冲突的问题。于是配置以下(目的想将目标计算机类型“X86”改为“X64″,这样模块计算机类型与目标计算机类型均为“X64”):

  • nmake.bat中的 #WIN64改为WIN64
  • 环境变量path include中路径有x86的改为 x64
  • 打开vs2017,创建新的c++文件,在文件名右键——属性——链接器——高级——目标计算机x86改为x64;链接器——命令行——添加”/machine:X64 /debug”;生成事件——配置管理器——两处“平台”x86改为x64
  • 在命令行 x64 Native Tools Command Prompt for VS 2017写入下命令:
  • cd D:\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
  • vcvarsall.bat amd64
  • cd D:\GDAL\gdal-2.3.2
  • nmake /f

    makefile.vc

    MSVC_VER=1910 WIN64=yes

    发现还是出现模块计算机类型“X64”与目标计算机类型“X86”冲突,即使在 x64 Native Tools Command Prompt for VS 2015中也会出现,这个问题就没解决。

    后来我想了要避免模块计算机类型“X64”与目标计算机类型“X86”冲突,就要安装GDAL WIN32类型的,使模块计算机类型与目标计算机类型均为“X86”。所以在nmake.bat中的 #WIN64不改动,环境变量path include中路径有x64的改为 x86, vs2017 属性的目标计算机改为x86 ,两处“平台”由x64改回为x86

    在 x86 Native Tools Command Prompt for VS 2017中写下命令:
  • cd D:\GDAL\gdal-2.3.2
  • nmake /f

    makefile.vc

    MSVC_VER=1910
  • nmake /f

    makefile.vc

    install MSVC_VER=1910
  • nmake /f

    makefile.vc

    devinstall MSVC_VER=1910

    就成功了,命令中去掉了WIN64=yes,且注意不要在命令行开始写这两个命令:
  • cd D:\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
  • vcvarsall.bat x86(或者vcvarsall.bat amd64_x86)

    不去配置环境变量

    同时,在每次更改配置完成后,都会重启电脑再运行命令行的命令。多次重启终于折腾成功了。



4、vs2017适配:

安装完成后,按照这两篇博文适配;


https://blog.csdn.net/qq_32153213/article/details/81363588

VS2017编译配置GDAL——超详细,适合初学者!!!


https://blog.csdn.net/Dragonzxc/article/details/80356883

gdal库编译并适配至vs2017

(1)这两篇博文在添加包含目录、库目录的位置不一样,一个在VC++目录,一个在C/C++及链接器里,为避免错误,都适配;

(2)在测试是否配置成功的示例代码中,注意:因为我装的是x86的版本,所以程序需在X86下运行!否则报错,如下:

在这里插入图片描述

在这里插入图片描述



5、参考文献

[2]:

https://www.cnblogs.com/litengyao/p/5150272.html

Windows10 + VS2015 环境下对gdal2.0.1进行64bit编译小结

[3]:

https://blog.csdn.net/qq_32153213/article/details/81363588

VS2017编译配置GDAL——超详细,适合初学者!!!

[4]:

https://www.jianshu.com/p/bfbf2bec954c

vs2017安装GDAL

[5]:

https://stackoverflow.com/questions/26024919/unresolved-external-symbol-when-compiling-gdal-1-11-0-on-windows

问题解决INK : error LNK2001: 无法解析的外部符号 OGRFeatureStylePuller

[6]:

https://blog.csdn.net/u012814856/article/details/78530596

问题解决 NMAKE : fatal error U1077: “rc”: return code“0x1” Stop.

[7]:

https://blog.csdn.net/qq50031185/article/details/20501761

问题解决 XCOPY不是内部或外部命令,也不是可运行程序 修复

[8]:

https://blog.csdn.net/wgx571859177/article/details/80453649#commentBox

模块计算机类型“X86”与目标计算机类型“X64”冲突的原因分析与解决方案



版权声明:本文为qq_29413829原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。