【GDAL】Ubuntu下使用CMake编译安装GDAL3.9.1,绑定Java(超详细)

Ubuntu下使用CMake编译安装GDAL3.9.1,绑定Java(超详细)

前言

之前写过一篇使用CMake编译GDAL的博客,但是经过更新,已经变得很乱了,并且新版GDAL编译方式和旧版本略有不同,感兴趣的可以去看看,这是链接。这里重新写一篇。

*** 注意,本文仅仅编译了GDAL内置驱动、Postgis驱动、FileGDB驱动和其他大部分驱动(未统计)。 因为驱动太多,在编译时需求的库很多,要一个一个的找库依赖,很麻烦,所以我并未一一安装,但是后面我会详细的说明如何找驱动依赖

想要用一键脚本安装的跳转到目录的第 节。

写好的Dockerfile在目录的第 节。

写作不易,如果有帮助点个赞吧。

一、各组件版本

1、最低需求

编译GDAL,对所需组件的版本是有要求的,如下(如果需要FileGDB驱动):

组件版本
Ubuntu16.04-LTS 或 18.04-LTS
CMake>= 3.16
gcc>= 5.1
PROJ>= 6.3.1
SQLite>= 3.11.0
SWIG>= 4
Java>= 1.8
FileGDB>= 1.5.1

2、原因

情况有点复杂,我尽量说得简单点。

Ⅰ、Ubuntu

Ubuntu要求16.04是因为FileGDB 1.5.1最高支持Ubuntu 16.04版本。
要求18.04 LTS是因为FileGDB 1.5.3最高支持Ubuntu 18.04

* 如果你不使用FileGDB驱动,那么对操作系统版本没有要求。

Ⅱ、CMake

CMake最低要求3.16GDAL官方文档里写清楚的

Ⅲ、GCC

gcc最低要求5.1的原因是:GDAL 3.9.1使用的是C99C++17标准,gcc 5.1开始支持C++17同时也支持C99GDAL 3.9.0之前支持的C++标准是C++11,可以不用gcc 5.1,为了方便最低都使用gcc 5.1吧。

Ⅳ、PROJ

官方文档里说的GDAL 3.9.1最低支持PROJ 6.3.1,小于GDAL 3.9.1,大于GDAL 3.6.1,都能使用这个版本的PROJ

Ⅴ、SQLite

因为GDAL 3.9.1最低支持PROJ 6.3.1,而PROJ 6.3.1最低支持SQLite 3.11.0,所以最低用SQLite 3.11.0就行。

Ⅵ、SWIG

这是用来编译其他语言链接的,我们要链接Java,这个库是最重要的,官方要求最低版本是4

Ⅶ、Java

你可以用Java1.8也可以用Java21,这个不强制要求。

Ⅷ、FileGDB

一个重要的点,如果使用FileGDB 1.5.1,最高使用Ubuntu 16.04 LTS
如果使用FileGDB 1.5.3,则最高使用Ubuntu 18.04 LTS

3、本文使用的版本

根据上面的版本情况,本文使用(组件下载配合科学上网更佳):

组件版本下载地址
Ubuntu18.04-LTS/
CMake3.30.1点击下载
gcc10.3.0/
PROJ9.4.1点击下载
SQLite3.46.0点击下载
SWIG4.2.1点击下载
Java1.8点击下载
FileGDB1.5.2点击下载
GDAL3.9.1点击下载
其他驱动库若干/

** 请注意,FielGDB的最新版本是1.5.3,但是我们使用的是1.5.2版本,因为Ubuntu 18.04LTS自带的ldd版本是2.27,但是我实测编译FileGDB 1.5.3需要用到ldd >= 2.28,也就是说不更新ldd版本的话,Ubuntu 18.04目前是无法编译成功FileGDB 1.5.3的。官方Github上说能编译过,但是我没成功,所以用的1.5.2

我也不敢贸然更新ldd,因为它牵扯很多系统核心,其中就有glibc,应该说ldd的版本是依赖glibc的,glibc是系统和内核交互的库,它是一个标准的C语言库。所以尽量别动这玩意,可能导致系统崩溃

4、注意

*** 请尽量遵循版本要求,尤其是最低版本要求,否则可能会有错误发生。

如果要和我编译一样的版本,请一定严格按照我的步骤走

二、配置、安装组件

在开始安装之前,请保证系统的apt源是最新的:

sudo apt update
sudo apt upgrade -y

1、设置环境变量、添加软件仓库

首先我们提前设置好要使用的环境变量。其次还有一个问题:有些库在Ubuntu默认的源下是无法下载的,我们得将所需库所在仓库的地址添加进来,执行:

echo "export JAVA_HOME=/gdal391_compiler/soft/java-se-8u41-ri" >> ~/.bashrc && source ~/.bashrc &&
echo "export ANT_HOME=/gdal391_compiler/soft/apache-ant-1.10.14" >> ~/.bashrc && source ~/.bashrc &&
echo "export PATH=$ANT_HOME/bin:$JAVA_HOME/bin:$PATH" >> ~/.bashrc && source ~/.bashrc &&
echo "export LD_LIBRARY_PATH=/usr/local/pgsql/lib/:/usr/lib:/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH" >> ~/.bashrc &&
source ~/.bashrc

sudo add-apt-repository -y ppa:ubuntugis/ppa && # 这个仓库是安装大部分GDAL驱动的
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test && # 这个仓库是安装gcc高版本的
sudo add-apt-repository -y ppa:git-core/ppa && # 这个仓库是安装高版本git的,如果你不用高版本git,这个可以省略
sudo apt update && sudo apt upgrade -y

简单说明:添加ppa:ubuntu-toolchain-r/test的原因是本机如果直接apt install gcc的话,在Ubuntu 18.04LTS上会默认安装gcc-7g++-7,所以添加这个仓库安装想要的版本。

2、安装驱动库和一些必要工具

这些驱动库的大部分来源是gdal-bin gdal-dev这两个包所依赖的库,也就是说你可以通过执行apt install gdal-bin gdal-dev来安装下面大部分的库,但是它不全,以下的库都是我总结出来的:

sudo apt install -y \
autotools-dev binutils binutils-common binutils-x86-64-linux-gnu build-essential \
cpp cpp-7 default-libmysqlclient-dev dpkg-dev fakeroot fontconfig-config \
fonts-dejavu-core g++ g++-7 gcc gcc-7 gcc-7-base gdal-bin gdal-data \
gir1.2-harfbuzz-0.0 hdf5-helpers icu-devtools libaec-dev libaec0 \
libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl \
libarmadillo-dev libarmadillo8 libarpack2 libarpack2-dev libasan4 libatomic1 \
libbinutils libblas-dev libblas3 libboost-dev libboost1.65-dev libc-dev-bin \
libc6-dev libcc1-0 libcilkrts5 libcurl4-gnutls-dev libdap-dev libdap25 libdapclient6v5 \
libdapserver7v5 libdpkg-perl libepsilon-dev libepsilon1 libexpat1-dev libfakeroot \
libfile-fcntllock-perl libfontconfig1 libfreexl-dev libfreexl1 libfyba-dev libfyba0 \
libgcc-7-dev libgdal-dev libgdal20 libgeos-3.6.2 libgeos-c1v5 libgeos-dev libgeotiff-dev \
libgeotiff2 libgfortran4 libgif-dev libgif7 libglib2.0-bin libglib2.0-dev libglib2.0-dev-bin \
libgomp1 libgraphite2-3 libgraphite2-dev libharfbuzz-dev libharfbuzz-gobject0 libharfbuzz-icu0 \
libharfbuzz0b libhdf4-0-alt libhdf4-alt-dev libhdf5-100 libhdf5-cpp-100 libhdf5-dev libicu-dev \
libicu-le-hb-dev libicu-le-hb0 libiculx60 libisl19 libitm1 libjbig-dev libjbig0 libjpeg-dev \
libjpeg-turbo8 libjpeg-turbo8-dev libjpeg8 libjpeg8-dev libjson-c-dev libkml-dev libkmlbase1 \
libkmlconvenience1 libkmldom1 libkmlengine1 libkmlregionator1 libkmlxsd1 liblapack-dev \
liblapack3 liblcms2-2 liblsan0 libltdl-dev libltdl7 liblzma-dev libminizip-dev libminizip1 \
libmpc3 libmpx2 libmysqlclient-dev libmysqlclient20 libnetcdf-dev libnetcdf13 libnspr4 \
libnss3 unixodbc-dev libopenjp2-7 libopenjp2-7-dev libpcre16-3 \
libpcre3-dev libpcre32-3 libpcrecpp0v5 libpng-dev libpng-tools libpoppler-dev \
libpoppler-private-dev libpoppler73 libpq-dev libpq5 libqhull-dev libqhull-r7 libqhull7 \
libquadmath0 libspatialite-dev libspatialite7 zlib1g-dev binutils-doc cpp-doc gcc-7-locales \
debian-keyring g++-multilib g++-7-multilib gcc-7-doc libstdc++6-7-dbg gcc-multilib autoconf \
automake flex bison gdb gcc-doc gcc-7-multilib libgcc1-dbg libgomp1-dbg libitm1-dbg \
libatomic1-dbg libasan4-dbg liblsan0-dbg libtsan0-dbg libubsan0-dbg libcilkrts5-dbg \
libmpx2-dbg libquadmath0-dbg libgdal-grass python-gdal libitpp-dev liblapack-doc libboost-doc \
libboost1.65-doc libboost-atomic1.65-dev libboost-chrono1.65-dev libboost-container1.65-dev \
libboost-context1.65-dev libboost-coroutine1.65-dev libboost-date-time1.65-dev \
libboost-exception1.65-dev libboost-fiber1.65-dev libboost-filesystem1.65-dev libboost-graph1.65-dev \
libboost-graph-parallel1.65-dev libboost-iostreams1.65-dev libboost-locale1.65-dev libboost-log1.65-dev \
libboost-math1.65-dev libboost-mpi1.65-dev libboost-mpi-python1.65-dev libboost-numpy1.65-dev \
libboost-program-options1.65-dev libboost-python1.65-dev libboost-random1.65-dev \
libboost-regex1.65-dev libboost-serialization1.65-dev libboost-signals1.65-dev \
libboost-stacktrace1.65-dev libboost-system1.65-dev libboost-test1.65-dev libboost-thread1.65-dev \
libboost-timer1.65-dev libboost-type-erasure1.65-dev libboost-wave1.65-dev libboost1.65-tools-dev \
libmpfrc++-dev libntl-dev glibc-doc libcurl4-doc libgnutls28-dev libidn11-dev libkrb5-dev \
libldap2-dev librtmp-dev libssh2-1-dev bzr libgdal-doc libgeotiff-epsg geotiff-bin libglib2.0-doc \
libgraphite2-utils libhdf4-doc hdf4-tools libhdf5-doc icu-doc liblcms2-utils libtool-doc \
liblzma-doc netcdf-bin netcdf-doc odbc-postgresql tdsodbc unixodbc-bin ogdi-bin \
libfreetype6-dev postgresql-doc-10 sqlite3-doc libstdc++-7-doc libsuperlu-doc \
automake=1:1.15.1-3ubuntu2 gfortran libogdi-dev libogdi4.1 libxml2-dev libprotobuf-dev protobuf-compiler &&
apt remove -y libproj-dev libproj13 proj-bin proj-data libsqlite3-0 libsqlite3-dev sqlite3 \
sqlite3-doc && apt autoremove -y &&
apt install -y netplan git libtiff-dev libcrypto++-dev m4 flex \
libpcre2-dev libreadline-dev
# 在卸载旧的proj或sqlite时,可能会连同netplan也卸载,如果被卸载了,重新安装即可。
# 此外,目前我只发现了netplan被卸载了,其他尚未可知,如果其他命令被卸载了,重新安装即可。

因为安装这些库它会自动安装低版本的PROJSqlite,并且安装的版本GDAL已经不再支持,所以我们必需得将它卸载并重新安装新版本。

*** 注意,在卸载过程中可能会将系统原有的某些命令也卸载,目前我只发现netplan命令被卸载了。如果还有其他命令被卸载,重新安装就行了。

3、安装GCC

上面安装库的时候,会自动给我们安装Ubuntu 18.04LTS对应的gcc 7.5,但是这个版本的gcc经我测试在编译GDAL时会有链接错误,所以这里我们用gcc 10.3,但为什么不是8.x版本的gcc呢?原因是下面某个软件需要gcc > 10,我具体搞忘了是哪个软件。

以下命令执行后不会卸载之前安装的gcc 7,也不建议卸载它:

sudo apt install -y gcc-10 g++-10 &&
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 &&
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100 &&
sudo update-alternatives --config gcc &&
sudo update-alternatives --config g++

4、下载一些库并手动编译

有些库无法直接安装最新版,我也懒得去找对应的ppa了,所以直接从源码编译,但是前提是我们得将源码下载下来。(不知道ppa是什么的 前往查看

因为是从GitHub上下载源码,如果没有科学上网手段,就去国内找代码镜像替换链接,或自己找库ppa地址自己安装。

GitHub下载的执行:

mkdir -p /gdal391_compiler/packages /gdal391_compiler/soft/ /gdal391_compiler/libs && 
cd /gdal391_compiler/libs &&
git clone https://github.com/curl/curl.git curl-8_9_1 &&
git clone https://github.com/json-c/json-c.git json-c-0.17-20230812 &&
mkdir googletest && cd googletest && git clone https://github.com/google/googletest.git v1.15.2

5、下载所需软件

将所需的JavaPROJCMake等软件全部下载解压,执行:

cd /gdal391_compiler/packages &&
wget https://github.com/Kitware/CMake/releases/download/v3.30.1/cmake-3.30.1.tar.gz &&
wget https://download.osgeo.org/proj/proj-9.4.1.tar.gz &&
wget https://www.sqlite.org/2024/sqlite-autoconf-3460000.tar.gz &&
wget https://nchc.dl.sourceforge.net/project/swig/swig/swig-4.2.1/swig-4.2.1.tar.gz?viasf=1 &&
wget https://github.com/Esri/file-geodatabase-api/raw/master/FileGDB_API_1.5.2/FileGDB_API-RHEL7-64gcc83.tar.gz &&
wget https://github.com/OSGeo/gdal/releases/download/v3.9.1/gdal-3.9.1.tar.gz && 
wget https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.gz && 
wget https://ftp.postgresql.org/pub/source/v16.3/postgresql-16.3.tar.gz &&
wget https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz &&
wget https://downloads.apache.org/ant/binaries/apache-ant-1.10.14-bin.tar.gz &&
mv swig-4.2.1.tar.gz\?viasf\=1 swig-4.2.1.tar.gz && tar -zxvf cmake-3.30.1.tar.gz -C ../soft/ &&
tar -zxvf FileGDB_API-RHEL7-64gcc83.tar.gz -C ../soft/ && tar -zxvf gdal-3.9.1.tar.gz -C ../soft/ &&
tar -zxvf proj-9.4.1.tar.gz -C ../soft/ && tar -zxvf sqlite-autoconf-3460000.tar.gz -C ../soft/ &&
tar -zxvf swig-4.2.1.tar.gz -C ../soft/ && tar -zxvf bison-3.8.2.tar.gz -C ../soft/ &&
tar -zxvf postgresql-16.3.tar.gz -C ../soft/ &&
tar -zxvf openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz -C ../soft/ &&
tar -zxvf apache-ant-1.10.14-bin.tar.gz -C ../soft/

----------------------------- 以下步骤请一步一步执行,上一步成功了才能下一步

6、编译安装CMake

这一步稍微耗时较长,执行:

# 你能提供多少线程给编译就 make -j数字 ,这个是加快编译速度的
cd /gdal391_compiler/soft/cmake-3.30.1/ && ./configure && make -j16 && make install

7、编译安装Sqlite3

执行:

# 你能提供多少线程给编译就 make -j数字 ,这个是加快编译速度的
cd /gdal391_compiler/soft/sqlite-autoconf-3460000 && ./configure && make -j16 && make install

8、编译安装curl

执行:

# -DCMAKE_BUILD_TYPE=Release 加快编译速度
cd /gdal391_compiler/libs/curl-8_9_1 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. 
&& cmake --build . && cmake --build . --target install

9、编译安装googletest

这一步在GDAL的编译中是非必须的,但是在PROJ的编译中必需,执行:

cd /gdal391_compiler/libs/googletest/v1.15.2 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. 
&& cmake --build . && cmake --build . --target install

10、编译安装PROJ

这一步耗时较长,耐心等待,不报错就行,执行:

cd /gdal391_compiler/soft/proj-9.4.1 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release ..  
&& cmake --build . && cmake --build . --target install

11、编译安装bison

这一步是编译安装swig的前提,执行:

cd /gdal391_compiler/soft/bison-3.8.2/ && ./configure && make -j16 && make install

12、编译安装swig

这是编译Java链接的前提,也就是生成gdal.jar,如果不需要就不必要,执行:

cd /gdal391_compiler/soft/swig-4.2.1 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. 
&& cmake --build .&& cmake --build . --target install

13、解压FileGDB驱动到lib目录

要想将FileGDB驱动加入GDAL,就必须让GDAL找得到驱动库,所以我们将驱动的lib文件都放到/usr/lib下,执行:

cd /gdal391_compiler/soft/FileGDB_API-RHEL7-64gcc83 && rm lib/libstdc++.* 
&& cp lib/* /usr/lib/ && cp include/* /usr/include/

14、编译安装PG库驱动依赖

安装这个库后GDAL才能访问PG数据库,执行:

cd /gdal391_compiler/soft/postgresql-16.3 && sudo apt -y install libicu-dev && ./configure 
&& make -j16 && make install

15、编译安装json-c

Ubuntu 18.04LTS自带的json-c我在编译时总会遇到版本低没有对应api的错误,所以我选择安装一个高版本json-c,执行:

cd /gdal391_compiler/libs/json-c-0.17-20230812 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. 
&& cmake --build . && cmake --build . --target install

三、编译安装GDAL

经过上面的准备后,我们终于可以正式编译GDAL了,准备过程也是十分的繁琐,但是好在我都给总结下来了,命令直接执行也是很快的。

1、配置

Ⅰ、依赖检查

进入GDAL的根目录,在根目录下创建一个build文件夹,当然,你想叫啥名都可以:

cd /gdal391_compiler/soft/gdal-3.9.1 && mkdir build && cd build

执行依赖检查,看看都有哪些驱动将要被编译,又有哪些驱动没有被编译进来,执行:

cmake \
-DFileGDB_INCLUDE_DIR=/usr/include/ \
-DPostgreSQL_LIBRARY=/usr/local/pgsql/lib/libpq.so \
-DPostgreSQL_INCLUDE_DIR=/usr/local/pgsql/include/  \
-DCMAKE_BUILD_TYPE=Release \
-DJSON-C_INCLUDE_DIR=/usr/local/json-c-0.15/include \
-DJSON-C_LIBRARY=/usr/local/json-c-0.15/lib/libjson-c.so ..

这一步没啥好解释的,都是在指定库在哪个目录

Ⅱ、如何寻找缺失的库

这一步执行完后,会爆红,像这样:

在这里插入图片描述

这是因为某些驱动没找到库,虽然不影响现在的编译,但是在后续的使用过程中会无法使用一些对应功能,因为没有驱动

找库就很简单了,例如这个库:

在这里插入图片描述

我们可以直接使用apt search搜索安装,也可以去Github上找源代码编译安装,这个库使用apt就能搜索到:

在这里插入图片描述

直接安装它再来GDAL下的build目录执行一遍上面的cmake命令就会发现,Cloud NOT find GeoTIFF ...的字样就没了。

如果搜索不到,那么就去Github上找源码,我们之前安装的googletestbison 等在 /gdal391_compiler/libs 目录下的都是我在Github上找到的。

此外,有些库的库名和Github上的名字不一样,你可以问问Ai,或者百度搜索。

Ⅲ、查看待编译驱动

上面我们看了由于没有依赖库所以没有编译进GDAL的驱动,这里我们来看要编译进GDAL的驱动都有哪些,好让你心里有数,知道缺什么不缺什么。

在执行完

cmake \
-DFileGDB_INCLUDE_DIR=/usr/include/ \
-DPostgreSQL_LIBRARY=/usr/local/pgsql/lib/libpq.so \
-DPostgreSQL_INCLUDE_DIR=/usr/local/pgsql/include/  \
-DCMAKE_BUILD_TYPE=Release \
-DJSON-C_INCLUDE_DIR=/usr/local/json-c-0.15/include \
-DJSON-C_LIBRARY=/usr/local/json-c-0.15/lib/libjson-c.so ..

后,我们拉到下面,会看到类似:

在这里插入图片描述

这就是GDAL内置驱动被开启,准备在接下来的编译过程中加入GDAL,继续往下拉,会看到类似:

在这里插入图片描述

我们之前安装的PG库驱动也生效了,往下拉会看到:

在这里插入图片描述

FileGDB的驱动也生效了。

不生效的选项继续往下拉,会看到类似:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

缺什么想要什么,就补什么吧。

2、编译

这一步耗时最长,耐心等待,执行:

cmake --build .

这一步只要没有报错停下来,就没问题

3、安装

最后一步了,执行:

cmake --build . --target install

没报错停下来就行。

查看版本看有没有安装成功:

gdalinfo --version

在这里插入图片描述

执行这个看哪些驱动被成功加进GDAL了:

gdalinfo --formats

在这里插入图片描述

同样的,缺什么补什么吧。重新编译一次。

4、Java(其他语言)链接

Java链接是自动生成的,如果在你的环境中找到Javaswigant的话,会编译生成一个可供项目使用的jar包和一个libgdalalljni.so动态链接库,我们只需要将生成的jar下载到本地,放进项目中就能使用GDAL 3.9.1jar包了,同时,也要拷贝libgdalalljni.so动态链接库到相应的目录下去。

在编译完成后,如果你的Javaswigant环境都没问题,在build目录下会生成一个swig文件夹,我们进去,会看到类似:

在这里插入图片描述

有一个Java文件夹,如果我们开启了其他语言的链接,那么这里还会有其他语言的文件夹,例如python,进入java目录:

在这里插入图片描述

两个文件是我们关心的,一个是gdal.jar,一个是libgdalalljni.sogdal.jar你可以选择下载下来使用,也可以不管它,但是必需得将libgdalalljni.so拷贝到/usr/lib中去(不一定是/usr/lib,只要是在LD_LIBRARY_PATH环境变量中的目录都能放),执行:

cp libgdalalljni.so /usr/lib

此外,gdal.jar这个包在/gdal-3.9.1/build/swig/java/build/maven下还有一份,但是这份是带了版本号的:gdal-3.9.1.jar,我觉得如果要用jar包的话,用这份比较好一点。

到这步Java的链接也完成了。

四、一键编译安装脚本

当然,上面的操作如果你觉得一步一步的走比较繁琐你也可以将这些命令放到bash shell脚本中去。

脚本我写好丢到Github上了,用git克隆到本地(脚本内容和上面的一样):

git clone https://github.com/yancy-hong/compile-gdal.git &&
cd compile-gdal/gdal-3.9.1

给脚本权限:

chmod +rwx compile-gdal3.9.1-ubuntu18.04.sh

两种方式执行(涉及~/.bashrc中的环境变量,所以最好不要用bash./命令来执行):

. compile-gdal3.9.1-ubuntu18.04.sh # 注意前面的点 .
# 或者
source compile-gdal3.9.1-ubuntu18.04.sh

五、Dockerfile

Dockerfile我也写好现成的直接复制就能用了:

FROM ubuntu:18.04

LABEL maintainer="yancy-hong <2530304058@qq.com>"

RUN apt update && apt upgrade -y && apt install -y software-properties-common

ENV JAVA_HOME /gdal391_compiler/soft/java-se-8u41-ri
ENV ANT_HOME /gdal391_compiler/soft/apache-ant-1.10.14
ENV PATH $ANT_HOME/bin:$JAVA_HOME/bin:$PATH
ENV LD_LIBRARY_PATH /usr/local/pgsql/lib/:/usr/lib:/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH

RUN add-apt-repository -y ppa:ubuntugis/ppa && \
	add-apt-repository -y ppa:ubuntu-toolchain-r/test && \
	add-apt-repository -y ppa:git-core/ppa && \
	apt update && apt upgrade -y
	
RUN apt install -y \
	autotools-dev binutils binutils-common binutils-x86-64-linux-gnu build-essential \
	cpp cpp-7 default-libmysqlclient-dev dpkg-dev fakeroot fontconfig-config \
	fonts-dejavu-core g++ g++-7 gcc gcc-7 gcc-7-base gdal-bin gdal-data \
	gir1.2-harfbuzz-0.0 hdf5-helpers icu-devtools libaec-dev libaec0 \
	libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl \
	libarmadillo-dev libarmadillo8 libarpack2 libarpack2-dev libasan4 libatomic1 \
	libbinutils libblas-dev libblas3 libboost-dev libboost1.65-dev libc-dev-bin \
	libc6-dev libcc1-0 libcilkrts5 libcurl4-gnutls-dev libdap-dev libdap25 libdapclient6v5 \
	libdapserver7v5 libdpkg-perl libepsilon-dev libepsilon1 libexpat1-dev libfakeroot \
	libfile-fcntllock-perl libfontconfig1 libfreexl-dev libfreexl1 libfyba-dev libfyba0 \
	libgcc-7-dev libgdal-dev libgdal20 libgeos-3.6.2 libgeos-c1v5 libgeos-dev libgeotiff-dev \
	libgeotiff2 libgfortran4 libgif-dev libgif7 libglib2.0-bin libglib2.0-dev libglib2.0-dev-bin \
	libgomp1 libgraphite2-3 libgraphite2-dev libharfbuzz-dev libharfbuzz-gobject0 libharfbuzz-icu0 \
	libharfbuzz0b libhdf4-0-alt libhdf4-alt-dev libhdf5-100 libhdf5-cpp-100 libhdf5-dev libicu-dev \
	libicu-le-hb-dev libicu-le-hb0 libiculx60 libisl19 libitm1 libjbig-dev libjbig0 libjpeg-dev \
	libjpeg-turbo8 libjpeg-turbo8-dev libjpeg8 libjpeg8-dev libjson-c-dev libkml-dev libkmlbase1 \
	libkmlconvenience1 libkmldom1 libkmlengine1 libkmlregionator1 libkmlxsd1 liblapack-dev \
	liblapack3 liblcms2-2 liblsan0 libltdl-dev libltdl7 liblzma-dev libminizip-dev libminizip1 \
	libmpc3 libmpx2 libmysqlclient-dev libmysqlclient20 libnetcdf-dev libnetcdf13 libnspr4 \
	libnss3 unixodbc-dev libopenjp2-7 libopenjp2-7-dev libpcre16-3 \
	libpcre3-dev libpcre32-3 libpcrecpp0v5 libpng-dev libpng-tools libpoppler-dev \
	libpoppler-private-dev libpoppler73 libpq-dev libpq5 libqhull-dev libqhull-r7 libqhull7 \
	libquadmath0 libspatialite-dev libspatialite7 zlib1g-dev binutils-doc cpp-doc gcc-7-locales \
	debian-keyring g++-multilib g++-7-multilib gcc-7-doc libstdc++6-7-dbg gcc-multilib autoconf \
	automake flex bison gdb gcc-doc gcc-7-multilib libgcc1-dbg libgomp1-dbg libitm1-dbg \
	libatomic1-dbg libasan4-dbg liblsan0-dbg libtsan0-dbg libubsan0-dbg libcilkrts5-dbg \
	libmpx2-dbg libquadmath0-dbg libgdal-grass python-gdal libitpp-dev liblapack-doc libboost-doc \
	libboost1.65-doc libboost-atomic1.65-dev libboost-chrono1.65-dev libboost-container1.65-dev \
	libboost-context1.65-dev libboost-coroutine1.65-dev libboost-date-time1.65-dev \
	libboost-exception1.65-dev libboost-fiber1.65-dev libboost-filesystem1.65-dev libboost-graph1.65-dev \
	libboost-graph-parallel1.65-dev libboost-iostreams1.65-dev libboost-locale1.65-dev libboost-log1.65-dev \
	libboost-math1.65-dev libboost-mpi1.65-dev libboost-mpi-python1.65-dev libboost-numpy1.65-dev \
	libboost-program-options1.65-dev libboost-python1.65-dev libboost-random1.65-dev \
	libboost-regex1.65-dev libboost-serialization1.65-dev libboost-signals1.65-dev \
	libboost-stacktrace1.65-dev libboost-system1.65-dev libboost-test1.65-dev libboost-thread1.65-dev \
	libboost-timer1.65-dev libboost-type-erasure1.65-dev libboost-wave1.65-dev libboost1.65-tools-dev \
	libmpfrc++-dev libntl-dev glibc-doc libcurl4-doc libgnutls28-dev libidn11-dev libkrb5-dev \
	libldap2-dev librtmp-dev libssh2-1-dev bzr libgdal-doc libgeotiff-epsg geotiff-bin libglib2.0-doc \
	libgraphite2-utils libhdf4-doc hdf4-tools libhdf5-doc icu-doc liblcms2-utils libtool-doc \
	liblzma-doc netcdf-bin netcdf-doc odbc-postgresql tdsodbc unixodbc-bin ogdi-bin \
	libfreetype6-dev postgresql-doc-10 sqlite3-doc libstdc++-7-doc libsuperlu-doc \
	automake=1:1.15.1-3ubuntu2 gfortran libogdi-dev libogdi4.1 libxml2-dev libprotobuf-dev protobuf-compiler && \
	apt remove -y libproj-dev libproj13 proj-bin proj-data libsqlite3-0 libsqlite3-dev sqlite3 \
	sqlite3-doc && apt autoremove -y && \
	apt install -y wget netplan git libtiff-dev libcrypto++-dev m4 flex \
	libpcre2-dev libreadline-dev
	
RUN apt install -y gcc-10 g++-10 && \
	update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 && \
	update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 100 && \
	update-alternatives --config gcc && \
	update-alternatives --config g++
	
RUN mkdir -p /gdal391_compiler/packages /gdal391_compiler/soft/ /gdal391_compiler/libs && \
	cd /gdal391_compiler/libs && git clone https://github.com/curl/curl.git curl-8_9_1 && \
	git clone https://github.com/json-c/json-c.git json-c-0.17-20230812 && \
	mkdir googletest && cd googletest && git clone https://github.com/google/googletest.git v1.15.2

RUN cd /gdal391_compiler/packages && \
	wget https://github.com/Kitware/CMake/releases/download/v3.30.1/cmake-3.30.1.tar.gz && \
	wget https://download.osgeo.org/proj/proj-9.4.1.tar.gz && \
	wget https://www.sqlite.org/2024/sqlite-autoconf-3460000.tar.gz && \
	wget https://nchc.dl.sourceforge.net/project/swig/swig/swig-4.2.1/swig-4.2.1.tar.gz?viasf=1 && \
	wget https://github.com/Esri/file-geodatabase-api/raw/master/FileGDB_API_1.5.2/FileGDB_API-RHEL7-64gcc83.tar.gz && \
	wget https://github.com/OSGeo/gdal/releases/download/v3.9.1/gdal-3.9.1.tar.gz &&  \
	wget https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.gz &&  \
	wget https://ftp.postgresql.org/pub/source/v16.3/postgresql-16.3.tar.gz && \
	wget https://download.java.net/openjdk/jdk8u41/ri/openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz && \
	wget https://downloads.apache.org/ant/binaries/apache-ant-1.10.14-bin.tar.gz && \
	mv swig-4.2.1.tar.gz\?viasf\=1 swig-4.2.1.tar.gz && tar -zxvf cmake-3.30.1.tar.gz -C ../soft/ && \
	tar -zxvf FileGDB_API-RHEL7-64gcc83.tar.gz -C ../soft/ && tar -zxvf gdal-3.9.1.tar.gz -C ../soft/ && \
	tar -zxvf proj-9.4.1.tar.gz -C ../soft/ && tar -zxvf sqlite-autoconf-3460000.tar.gz -C ../soft/ && \
	tar -zxvf swig-4.2.1.tar.gz -C ../soft/ && tar -zxvf bison-3.8.2.tar.gz -C ../soft/ && \
	tar -zxvf postgresql-16.3.tar.gz -C ../soft/ && \
	tar -zxvf openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz -C ../soft/ && \
	tar -zxvf apache-ant-1.10.14-bin.tar.gz -C ../soft/

RUN cd /gdal391_compiler/soft/cmake-3.30.1/ && ./configure && make -j16 && make install

RUN cd /gdal391_compiler/soft/sqlite-autoconf-3460000 && ./configure && make -j16 && make install

RUN cd /gdal391_compiler/libs/curl-8_9_1 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && \
	cmake --build . && cmake --build . --target install
	
RUN cd /gdal391_compiler/libs/googletest/v1.15.2 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && \
	cmake --build . && cmake --build . --target install
	
RUN cd /gdal391_compiler/soft/proj-9.4.1 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && \
	cmake --build . && cmake --build . --target install

RUN cd /gdal391_compiler/soft/bison-3.8.2/ && ./configure && make -j16 && make install

RUN cd /gdal391_compiler/soft/swig-4.2.1 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && \
	cmake --build .&& cmake --build . --target install
	
RUN cd /gdal391_compiler/soft/FileGDB_API-RHEL7-64gcc83 && rm lib/libstdc++.* && \
	cp lib/* /usr/lib/ && cp include/* /usr/include/
	
RUN cd /gdal391_compiler/soft/postgresql-16.3 && apt -y install libicu-dev && ./configure && \
	make -j16 && make install
	
RUN cd /gdal391_compiler/libs/json-c-0.17-20230812 && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && \
	cmake --build . && cmake --build . --target install
	
RUN cd /gdal391_compiler/soft/gdal-3.9.1 && mkdir build && cd build && \
	cmake \
	-DFileGDB_INCLUDE_DIR=/usr/include/ \
	-DPostgreSQL_LIBRARY=/usr/local/pgsql/lib/libpq.so \
	-DPostgreSQL_INCLUDE_DIR=/usr/local/pgsql/include/  \
	-DCMAKE_BUILD_TYPE=Release \
	-DJSON-C_INCLUDE_DIR=/usr/local/json-c-0.15/include \
	-DJSON-C_LIBRARY=/usr/local/json-c-0.15/lib/libjson-c.so .. && \
	cmake --build . && cmake --build . --target install && \
	cp swig/java/libgdalalljni.so /usr/lib && rm -rf /gdal391_compiler/packages && \
	gdalinfo --formats && gdalinfo --version

生成的镜像有点大,3.5GB左右,耗时大约在25分钟 ~ 40分钟(根据机器性能以及网络速度)

写在最后

目前我尚未对其进行测试,所以可能存在问题,后续有问题我会回来更新博客内容。

有问题欢迎评论区留言,看见会帮解答。

叠个甲,此篇博客的内容仅代表我个人观点,所有异常、Bug等问题概不负责。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值