歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

VS2015下編譯64位GDAL總結

使用VS2015編譯最新的64位GDAL(最新gdal2.11),確實有一些問題,看來雙方還是太新了,有點不兼容,特總結如下。

以前經常用的通過VisualStudio IDE進行編譯的方式現在似乎不能使用了, makegdal_gen.bat還是可以生成工程,也能升級成VS2015的工程,但是修改nmake.opt的一些配置沒有生效,導致編譯無法成功。

只能使用“VS2015 x64 本機工具命令提示符”來nmake工程的方法。“VS2015 x64 本機工具命令提示符”一般都在安裝VS環境後的“開始”目錄中可以找到。很奇怪為什麼網上很多攻略不是用這個CMD窗口,而是很麻煩的設置其他窗口。

然後我們必須得把這個CMD窗口CD到下載好的源代碼目錄(有makefile.vc的目錄),Nmake就是通過makefile.vc來編譯工程的。在編譯之前需要修改nmake.opt中一些配置。

  1. GDAL_HOME = "C:\warmerda\bld",這裡的路徑可以修改,編譯後的生成的頭文件、靜態庫、動態庫將會復制到該目錄。
  2. "#WIN64=YES",編譯64位GDAL需要取消前面的#。

最後在CMD中批處理命令:

nmake -f makefile.vc
nmake /f makefile.vc install
nmake /f makefile.vc devinstall

第一個命令是編譯GDAL,第二個、第三個命令是將生成的頭文件、靜態庫、動態庫復制到GDAL_HOME目錄。如果需要編譯debug模式,就將第一個命令改成nmake -f makefile.vc DEBUG=1。

最後編譯還存在一個問題,形如:

Creating library gdal_i.lib and object gdal_i.exp
odbccp32.lib(dllload.obj) : error LNK2019: unresolved external symbol _vsnwprintf_s referenced in function StringCchPrintfW
gdal201.dll : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\amd64\link.EXE"' : return code '0x460' Stop.

在網上查找攻略,得知是矢量格式odbc這部分的問題。這部分內容涉及到的環境在VS2015下貌似被修改,導致GDAL不兼容。不過我也沒有試驗是不是VS2015的專屬問題。網上提到的第一個方法是nmake.opt中如下內容:

!IFDEF ODBC_SUPPORTED
ODBCLIB = odbc32.lib odbccp32.lib user32.lib
!ENDIF

替換成:

!IFDEF ODBC_SUPPORTED
!IF $(MSVC_VER) >= 1900
# legacy_stdio_definitions.lib : https://connect.microsoft.com/VisualStudio/feedback/details/1134693/vs-2015-ctp-5-c-vsnwprintf-s-and-other-functions-are-not-exported-in-appcrt140-dll-breaking-linkage-of-static-libraries
ODBCLIB = legacy_stdio_definitions.lib odbc32.lib odbccp32.lib user32.lib
!ELSE
ODBCLIB = odbc32.lib odbccp32.lib user32.lib
!ENDIF
!ENDIF

很可惜這部分內容和nmake.opt中的一模一樣,貌似已經被GDAL官方采用並修改好了。也就是說第一個方法是不行的,不知道是不是我采用64位編譯的原因。

第二個辦法是注釋掉對矢量格式odbc的支持,即:

# Comment out the following to disable ODBC support.
ODBC_SUPPORTED = 1

修改成:

# Comment out the following to disable ODBC support.
# ODBC_SUPPORTED = 1

第二個辦法是可以成功編譯的,稍微遺憾的是缺少了矢量格式odbc的支持,對我來說是夠用了。希望GDAL官方能進一步跟進,當然大家有更好的辦法也希望批評指正。

Copyright © Linux教程網 All Rights Reserved