在 python 下使用 GDAL 已经相当舒服了,但 GDAL 本身毕竟还是用 C++ 写的,在 C++ 的环境里导入 GDAL 进行二次开发也一定能带来更快的运行速度。正好最近选学的“C++与GIS内核开发”这门课讲到了静态库/动态库,因此我想尝试下在 VS 上配置好环境,感受下原生的 C++ 版本的 GDAL 到底有多快。
前言:g++的失灵
在 Visual Studio 上新建一个工程会产生一大堆的附属文件,打开这个工程也卡卡的。当搞来现成的脚本时,我是更愿意在终端里使用 g++ 一下子编译好,然后愉快使用的。编译的指令很简单,就类似于:
g++ -I <gdal-include-path> <cpp-file-path> -o <out-exe-path> -L <gdal-lib-path> -lgdal
以实际情况为例:
g++ -I /usr/local/gdal/include /home/yonniye/Code/cppBE.cpp -o /home/yonniye/Code/cppBE -L /usr/local/gdal/lib -lgdal
在 Linux 上使用 g++ 编译当然是最方便快捷的,但我迁移相同的命令到 win 上就会莫名失败,报 undefined reference to...
和 ld returned 1 exit status
的错误,在 Github 或 Stackoverflow 上对着搞半天也搞不好。不得已,我只能回笨笨的 VS 上乖乖从零开始了。
将VS平台从x86改为x64
这是一个非常容易被忽略的点!一般来说,现在的电脑都是 64 位的,安装的 GDAL 应该也是 64 位的。VS 默认的解决方案平台是 x86(32 位),在这种情况下是无法调用 64 位的 dll 的。因此在一切开始前,需要先将平台从 x86 改为 x64,如下:
添加包含目录与库目录
常规操作,右击解决方案,点击属性,载入 include
与 lib
目录。
导入gdal_priv.h
gdal_priv.h
文件是 C++ GDAL 的 entry point,导入这个头文件后就能使用 GDAL 的函数了。可以看 VS 里面这行导入语句有没有报警告,如果没报警告说明上面那步做对了。
#include <gdal_priv.h>
#include <iostream>
#include <math.h>
导入静态链接库
仅添加静态链接库的目录是不够的,它们还没有被加进项目里。所以还需要手动在解决方案的资源文件里导入所有的静态链接库:
argv的调试
以前我一直不知道如果main()
函数里带了argv
该如何编译调试,后来才发现可以在“调试”——“命令参数”里进行设置。
后记与小结
本文讲了我是如何在 VS 上配置 C++ GDAL 二次开发的环境的。在配置之前,关于 x86 和 x64 的坑我从未经历过。配完环境后,我拿了个读取栅格并计算某指标的程序分别在 C++ 与 Python 上作了测试。同样的图像和计算内容,C++ 计算一次比 Python 快了近 4 倍。亲身体验发现:使用 C++ 做底层确实快哇!