1. 程式人生 > >VS2017編譯GDAL常見問題

VS2017編譯GDAL常見問題

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.hC:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\um;
  • winapifamily.hC:\Program Files (x86)\Windows Kits\10\Include\10.0.10586.0\shared

4、cannot open output file “odbc32.lib”

解決方法:對於lib檔案的,新增地址到環境變數Lib中。
地址:

  • odbc32.libC:\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、參考文獻