使用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中一些配置。
最後在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官方能進一步跟進,當然大家有更好的辦法也希望批評指正。