尝试在Windows下编译PDAL

起因

为了和室友抱团,加上不知道英语课时间可以调,撤掉了周三的GIS软件工程,选了3S集成作为必修课。这课点名少,不提问,没有平时作业,然而作业却比较痛苦,要对一个点云数据进行分割。这对于对点云一无所知的我来说简直可怕,还要月底前交报告。于是开始着手做,发现老师推荐的数据处理库是著名的点云库PCL 1,而给的数据格式却是las格式。

于是搜了一下,发现没有现成的转换工具,要么自己写代码要么用一个叫PDAL 2的项目提供的命令行工具进行转换。这个命令行听起来很吸引人,于是决定试一试。官网说OSGEO提供了现成的PDAL二进制文件,装好之后发现只有开发用的dll,并没有命令行工具的可执行文件分发,因为这个库主要是用来开发的,命令行工具只是副产品。于是踏上了可怕的编译之路。

尝试Docker未遂

官网又说,这个PDAL啊有一个不好就是依赖关系太复杂,建议通过Docker镜像来用。于是按照官方文档3搞好了Docker,重启在BIOS里打开了上次还是做Windows Phone开发时模拟器需要的虚拟化和Hyper-V功能。结果发现Docker还是启动不了,原因是资源不足,要调高级设置。最低的资源配置是一个CPU内核加1GB内存。默认是2GB,而我的笔记本总共只有4GB当然就启动不了了。调好设置又按教程兴冲冲地运行了pdal info命令发现可以执行后,以为大功告成实现格式转换了。后来发现转换格式的pdal translate命令还是跑不动,一个必要的模块因资源不足无法加载。

无奈,在最后一步还是跪了,早知道在实验室8GB的机器上搞不就没这回事了么。

生成VS 2010工程

准备工作

其实我一开始没看到Docker方案的时候已经想直接编译了,期间通过改git的proxy设置以及浅层clone才得以快速clone到PDAL项目的源代码。然后安装了从没用过的CMAKE,其实一开始就注意到Windows编译教程里的git和cmake版本都比较老,预料到坑比较多,但是没辙,谁让我CentOS的移动硬盘也不在手边呢。另外通过OSGEO安装依赖项教程问题不大,只不过中间还惨遭一段莫名断网耽误了一些时间。

找不到GDAL

颤颤巍巍跟着官网的教程4一步步走下来,从没用过CMAKE的我终于要运行批处理命令执行编译了。结果问题出现了,报找不到GDAL库。然后发现mpg-config.bat里边配置的OSGEO安装路径是默认的,而我之前安装有意没用默认路径,心想改了就好了呗,结果还是持续报错。不知所措的我还对另一个编译配置文件hobu-config.bat改来改去了半天,其实跟需要运行的东西没有一点关系。

四处搜索无果后,硬头皮看shell输出的StackTrace,终于找到了问题所在,原来./cmake/modules/FindGDAL.cmake文件95行判断的是OSGEO4W_ROOT是否设置,而bat里设置的却是OSGEO4W_DIR。而未设置的处理是使用默认的C盘安装路径,这自然是找不到了。于是在批处理里设置了OSGEO4W_DIR变量,GDAL找不到的问题得以解决。

其实还有一个问题就是我一开始不知道CMAKE生成失败后会留下CMakeCache.txt文件,从而阻止后续的生成操作。这也是期间通过搜索才了解的。

找不到ZLIB和LIBXML2

解决了一个问题,接着肯定还有问题。CMAKE又报错,ZLIB找不到。这次直接顺着StackTrace里的路径,结果一直找到了CMAKE的安装目录里。有点含糊,这不能改吧,搜了一下,发现在Windows上找不到zlib很常见,可以通过在批处理最后的CMAKE命令中通过参数-DZLIB_LIBRARY= -DZLIB_INCLUDE_DIR=设置zlib的引用路径即可。通过OSGEO安装程序查看发现zlib是随OSGEO安装的,找到OSGEO目录里一搜发现LIBXML2只默认装了运行时dll库,没有解决GDAL时的include和lib文件,于是又装了教程里漏掉的zlib-devel组件,再设置LIBRARY和INCLUDE路径参数即可。

接着是CURL、JSONCPP、LIBXML2三个库报找不到,不过好像前两个不是致命错误,所以只着手解决最后一个。从OSGEO目录里发现前两个的确没装,最后一个是装了的。不过排查过程中发现这是与Oracle相关的模块,打算从编译中屏蔽掉这一块,算是走了个弯路,毕竟那么多cmake文件,完全不懂的我怎么可能移除干净。于是用了和zlib一样不太优雅的方法予以解决。

终于shell在一系列检查和警告之后成功地输出了VS工程文件。
> Build files have been written to: E:/Program Files (x86)/PDAL/PDAL

编译

用VS打开PDAL.sln文件,加载时的91个项目也是让孤陋寡闻的我叹为观止。然后官网的F6快捷键我这里好像并不存在,用菜单生成整个解决方案。

> 生成: 成功 5 个,失败 75 个,最新 1 个,跳过 4 个

这也是让我摸不着头脑。我还是去找个调用dll转格式的代码吧……