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中一些配置。
- GDAL_HOME = "C:\warmerda\bld",这里的路径可以修改,编译后的生成的头文件、静态库、动态库将会复制到该目录。
- "#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官方能进一步跟进,当然大家有更好的办法也希望批评指正。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)