认识GDAL三方库
本小节是总结当前GDAL 3.8.5版本官方说明里的依赖库部分,旨在告诉大家要知道GDAL到底依赖哪些库,哪些是必须要编译的,哪些是可选扩展,因为它的扩展实在太多太多了:
- 必需的三方库(REQUIRED packages )
序号 | 名称 | 说明 | 下载地址 |
---|---|---|---|
1 | PROJ | 最低版本>=6.0 | proj-9.4.0 |
只有一个PROJ是GDAL在编译的时候强制要求必须要自己提供
- 内置的三方库(Internal libraries)
序号 | 名称 | 说明 |
---|---|---|
1 | TIFF | |
2 | GEOTIFF | |
3 | ZLIB | |
4 | PNG | |
5 | JPEG | |
6 | GIF | |
7 | JSONC | |
8 | OPENCAD | |
9 | QHULL | |
10 | LERC |
GDAL每个版本自己都会内置基础的一些必要库
因此结合1、2可知设置完PROJ就可以常规限度的开始编译并使用GDAL库了
- 推荐设置的三方库(RECOMMENDED packages)
序号 | 名称 | 说明 |
---|---|---|
1 | SWIG | 全称:Software development tool 连接用C和c++编写的程序与各种高级编程语言的软件开发工具,例如调用JAVA、Python等 |
2 | CURL | 程序能够使用web API |
3 | EXPAT | 读写XML格式文件 |
4 | TIFF | 最低需要4.0版本,读写TIFF格式文件 |
5 | GeoTIFF | 读写GeoTIFF格式文件 |
6 | PNG | 读写PNG格式文件 |
7 | JPEG | 读写JPEG格式文件 |
8 | QHULL | 处理多维几何数据,凸包、Delaunay三角剖分、Voronoi图等操作 |
9 | LERC | 栅格数据的压缩 |
10 | SQLite3 | 链接SQLite数据库能力 |
10 | GEOS | 对几何对象执行复杂的空间查询和操作 |
和上面2内置有一定的条目重复,表示虽然官方有内置的代码,能够即使在不提供的情况,也可以动态编译这些库
但官方还是更推荐上面几个条目重复的是使用你自己提供的相关库,不要用内置的
- 其他可选扩展三方库(RECOMMENDED packages)
Python | ODBCCPP | MSSQL_NCLI |
MySQL | ICONV | LibXml2 |
XercesC | Deflate | OpenSSL |
CryptoPP | ZSTD | SFCGAL |
OpenCAD | BRUNSLI | libQB3 |
PCRE2 | PCRE | SPATIALITE |
RASTERLITE2 | LibKML | KEA |
HDF5 | WebP | FreeXL |
GTA | MRSID | Armadillo |
CFITSIO | HDF4 | ECW |
NetCDF | OGDI | OpenCL |
PostgreSQL | FYBA | LibLZMA |
LZ4 | Blosc | ARCHIVE |
LIBAEC | JXL | JXL_THREADS |
Crnlib | basisu | IDB |
rdb | TileDB | OpenEXR |
MONGOCXX | OpenJPEG | HDFS |
Poppler | Podofo | PDFIUM |
Oracle | TEIGHA | FileGDB |
KDU | LURATECH | Arrow |
BISON | Doxygen | Shapelib |
Java | … |
这些可扩展库里面在以往各种GIS项目开发过程中用的比较多的库有:
LibXml2(支持xml读写)
LibXml2用来替换原本的EXPAT,其实也没有仔细对比两个优劣势,公司团队开发环境一直以来就是用的就是libxml2,有时间再做对比分析吧,不是核心问题,其他的用的那就主打一个非常少了,只有特定场景或者技术研究的时候才会附加编译。
前期准备
根据上文,可以直接仅设置PROJ来编译GDAL,但根据官方建议,以及为了学习,我们将推荐与常用库都附加上
GDAL源码:gdal-3.8.5
PROJ源码:proj-9.4.0
SWIG这个不用,先单论C++,先不考虑和其他例如Java、Python交互
CURL源码:curl-8.7.1
EXPAT这个也不用,用的更多的是下面的LibXml2
TIFF源码:libtiff-4.6.0
GeoTIFF源码:libgeotiff-1.7.1
PNG源码:libpng-1.6.32
JPEG源码:libjpeg-3.0.1
QHULL源码:QHull-8.0.2
LERC源码:Lerc-4.0.0
SQLite3源码:sqlite-3.45.3
GEOS源码:Geos-3.12.1
LibXml2源码:libxml2-2.12.6
Zlib源码:因PNG强制依赖此库,zlib-1.3.1
Tcl源码:因SQLite3强制依赖此库,TCL-8.6.14
根据上面的依赖关系,则需要按顺序反过来依次编译
CMake一定要注意修改CMAKE_INSTALL_PREFIX的安装路径,不然这么多库整理起来很麻烦
Visual Studio批生成遇到Set Local…错误无法install的时候,将VS作为管理员启动再打开工程就可以解决,但根本问题可能是没有正确指定CMAKE_INSTALL_PREFIX或者库指定的INSTALL属性,输出到C盘、文件名冲突、错误文件地址等等各种情况导致创建文件夹失败,所导致的SetLocal问题
编译
编译基础库
只是名义上的、仅在此处的无需依赖的基础库,并不是真的没有依赖,里面有很多是有可选依赖的,只是没有强制要求附加某项依赖罢了
例如Tiff
这个库,它就可选GIF、JPEG、ZLIB、PNG
等等三方库依赖
在原则上,上位库不应指定下位库必须要打开什么扩展来进行编译,否则就是耍流氓…(当然这种情况也会有,老外也不是完人,特事特论)
我们最终是要编译GDAL库,因此所有的三方依赖库只用最基础、最低限度的核心模式就好了
- 编译Zlib:注意有单独的CMake属性INSTALL来指定生成路径,指定CMAKE_INSTALL_PREFIX不行;
- 编译JPEG:CMake直接编译后ALL_BUILD和INSTALL,没有什么特殊的,记得改CMAKE_INSTALL_PREFIX;
- 编译CURL:同上;
- 编译Tiff:同上;
- 编译QHull:同上;
- 编译LERC:同上;
- 编译Geos:同上;
- 编译LibXml2:取消
LIBXML_WITH_PYTHON/ICONV/ZLIB/LZMA
四个勾选,后续同上;
编译PNG动态库
依赖:zlib(必须)
- 配置zlib
- 设置CMAKE_INSTALL_PREFIX
- 生成后ALL_BUILD、INSTALL编译安装
编译TCL、Sqlite3、PROJ
具体可参照另一篇博文:Windows源码编译PROJ指南,有关于TCL、Sqlite3以及PROJ的源码编译方法
编译GeoTiff静态库
依赖:TIFF(必须)、PROJ(必须)
- 配置proj
- 配置tiff,直接设置include_dir和lib_release,设置TIFF_DIR这个CMake导入配置会有问题
- 设置CMAKE_INSTALL_PREFIX
- 生成后ALL_BUILD、INSTALL编译安装
编译GDAL动态库
回到最开始的地方,GDAL如果只是作为其他库的第三方库来使用,可以只附加核心模式的PROJ后直接编译就好了
本文是为了学习并独立使用GDAL才去重新编译并替换这么多三方内置库,而不是一定要替换这些东西
下面的配置建议设置一项就Configure一次,这样会有更多选项出来供查看确认
- 取消与我们自己提供三方库重复的内置库勾选(GeoTiff、Jpeg、Lerc、Png、QHull、Tiff、Zlib)
- 取消GTest
- 配置zlib
- 配置curl
- 配置proj
- 配置GeoTiff
- 配置Tiff,需要手动添加一个Entry(TIFF_LIBRARY)
- 配置JPEG
- 配置PNG
- 配置QHull
- 配置LERC
- 配置Sqlite3
- 配置Geos
- 配置LibXml2,include要设置两个路径
- 设置CMAKE_INSTALL_PREFIX
- 生成后ALL_BUILD、INSTALL编译安装
组织二次开发包
神功大成!!!
- bin
需要额外将proj的share目录下的proj.db也拷贝放到bin目录下
-
include
-
lib