链接器错误构建GDAL



我正在使用MSVC 2015 64位命令提示符从源代码构建GDAL。我用的是Windows 8。在构建过程中,我得到了以下错误:

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.0VCBINamd64link.EXE"' : return code '0x460'
Stop.

我在微软网站和GDAL Git问题部分看到,这是2014年MSVC和MSVC 2015预发布版本的问题,但这个问题应该在MSVC 2015最终发布之前解决。

  • https://github.com/mapbox/windows-builds/issues/53
  • https://connect.microsoft.com/visualstudio/feedback/details/1134693/vs - 2015 - ctp - 5 - c - vsnwprintf s -和-其他-功能- -不-出口appcrt140 dll -破坏-连杆- -静态库

我似乎不是唯一一个有这个问题的人,但我也没有看到解决方案(除了恢复到旧版本的MSVC,如2013)。有人有幸使用MSVC 2015(64位)构建GDAL吗?

GDAL-2.1.0已经对nmake.opt做了类似的修改

!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

,但您还必须从命令行中使用参数MSVC_VER指定Visual Studio版本。例如,对于Visual Studio 2015 (MSVC_VER==1900),使用以下命令行编译

nmake -f makefile.vc MSVC_VER=1900
我编辑了nmake.opt:

我替换了第667行…:

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

:

!IFDEF ODBC_SUPPORTED  
!IF $(MSVC_VER) < 1900  
ODBCLIB = odbc32.lib odbccp32.lib user32.lib  
!ELSE  
ODBCLIB = legacy_stdio_definitions.lib odbc32.lib odbccp32.lib user32.lib  
!ENDIF  
!ENDIF

/安德斯

除了上述,我还必须对nmake进行以下修改。选择文件:

表示

的那行
!IFNDEF MSVC_VER
#assume msvc VS2008.
MSVC_VER=1500
!ENDIF

应该改成:

!IFNDEF MSVC_VER
#assume msvc VS2015.
MSVC_VER=1900
!ENDIF

最新更新