Ubuntu下使用CMake编译安装GDAL3.9.1,绑定Java(超详细)
前言
之前写过一篇使用
CMake
编译GDAL
的博客,但是经过更新,已经变得很乱了,并且新版GDAL
编译方式和旧版本略有不同,感兴趣的可以去看看,这是链接。这里重新写一篇。
***
注意,本文仅仅编译了GDAL
内置驱动、Postgis
驱动、FileGDB
驱动和其他大部分驱动(未统计)。 因为驱动太多,在编译时需求的库很多,要一个一个的找库依赖,很麻烦,所以我并未一一安装,但是后面我会详细的说明如何找驱动依赖
。
想要用一键脚本安装的跳转到目录的第
四
节。
写好的
Dockerfile
在目录的第五
节。
写作不易,如果有帮助点个赞吧。
一、各组件版本
1、最低需求
编译
GDAL
,对所需组件的版本是有要求的,如下(如果需要FileGDB驱动):
组件 | 版本 |
---|---|
Ubuntu |
16.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.16
是GDAL
官方文档里写清楚的
Ⅲ、GCC
gcc
最低要求5.1
的原因是:GDAL 3.9.1
使用的是C99
和C++17
标准,gcc 5.1
开始支持C++17
同时也支持C99
。GDAL 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、本文使用的版本
根据上面的版本情况,本文使用(组件下载配合科学上网更佳):
组件 | 版本 | 下载地址 |
---|---|---|
Ubuntu |
18.04-LTS |
/ |
CMake |
3.30.1 |
点击下载 |
gcc |
10.3.0 |
/ |
PROJ |
9.4.1 |
点击下载 |
SQLite |
3.46.0 |
点击下载 |
SWIG |
4.2.1 |
点击下载 |
Java |
1.8 |
点击下载 |
FileGDB |
1.5.2 |
点击下载 |
GDAL |
3.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-7
和g++-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被卸载了,其他尚未可知,如果其他命令被卸载了,重新安装即可。
因为安装这些库它会自动安装低版本的
PROJ
和Sqlite
,并且安装的版本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、下载所需软件
将所需的
Java
、PROJ
、CMake
等软件全部下载解压,执行:
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
上找源码,我们之前安装的googletest
、bison
等在/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
链接是自动生成的,如果在你的环境中找到Java
、swig
、ant
的话,会编译生成一个可供项目使用的jar
包和一个libgdalalljni.so
动态链接库,我们只需要将生成的jar
下载到本地,放进项目中就能使用GDAL 3.9.1
的jar
包了,同时,也要拷贝libgdalalljni.so
动态链接库到相应的目录下去。
在编译完成后,如果你的
Java
、swig
、ant
环境都没问题,在build
目录下会生成一个swig
文件夹,我们进去,会看到类似:
有一个
Java
文件夹,如果我们开启了其他语言的链接,那么这里还会有其他语言的文件夹,例如python
,进入java
目录:
两个文件是我们关心的,一个是
gdal.jar
,一个是libgdalalljni.so
,gdal.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 <[email protected]>"
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等问题概不负责。