openEuler22.03 环境编译安装 PostgreSQL 15.6 + PostGIS 3.4.1
文章目录
- 环境
- 查看依赖矩阵
- 编译安装 PostgreSQL15.6
- 编译过程中常见报错
- 报错1:
- 报错2:
- 报错3
- 报错4
- 报错5:
- 报错6:<奇葩的报错>
- 编译安装 PostGIS
- 安装 libxml2
- 安装 protobuf-c
- 安装 json-c
- 安装 sqlite-3 (因为 proj 会依赖于该库)
- 安装 libtiff, libcurl,mpfr 等库(proj会依赖该库)
- 安装 proj
- 安装 geos
- 安装 gdal
- 安装 PostGIS
- 注意事项
环境
[root@localhost xmz]# docker exec -it euler_compile_env bash[root@ff66b6827bf2 /]# cat /etc/os-release
NAME="openEuler"
VERSION="22.03 (LTS-SP3)"
ID="openEuler"
VERSION_ID="22.03"
PRETTY_NAME="openEuler 22.03 (LTS-SP3)"
ANSI_COLOR="0;31"
查看依赖矩阵
https://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS
编译安装 PostgreSQL15.6
下载并上传源码压缩包然后解压
编译 PG 安装
mkdir -p /usr/local/pgsql
cd postgresql-15.6
./configure --prefix=/usr/local/pgsql --with-python --with-openssl --with-libxml --enable-debug --enable-dtrace PYTHON=/usr/bin/python3.9 --with-readline
make -j $(nproc) world && make install-world
编译过程中常见报错
报错1:
<Python.h>file not found
解决方法:
需要去openouler网站下载并安装 rpm 包 (可以参考 more /etc/yum.repos.d/openEuler.repo 文件)[root@localhost ~]# rpm -Uvh python3-devel-3.9.9-28.oe2203sp3.x86_64.rpm --nodeps
警告:python3-devel-3.9.9-28.oe2203sp3.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID fb37bc6f: NOKEY
Verifying... ################################# [100%]
准备中... ################################# [100%]
正在升级/安装...1:python3-devel-3.9.9-28.oe2203sp3 ################################# [100%]
[root@localhost ~]#
报错2:
configure: error: library 'xml2' (version >= 2.6.23) is required for XML support
解决方法:
下载并安装 libxml2与 libxml2-devel 对应的 rpm 包
报错3
configure: error: library 'crypto' is required for OpenSSL
解决方法
下载并安装 openssl-devel 对应 rpm 包
报错4
configure: error: zlib library not found
解决方法:
下载并安装 zlib zlib-devel 对应 rpm 包
报错5:
Configure: error: readline not found
解决方法:
下载并安装 readline-devel 对应 rpm 包
报错6:<奇葩的报错>
make: Warning: File 'src/Makefile.port' has modification time 1707098160 s in the future
原因:
时间不对, 可能是系统时间过于老,比如我有个环境中 系统时间是 1970 年
解决方法:
手动将系统时间调整为正确的时间 date -s "真实时间"
然后 hwclock -w; hwclock -s
然后重新 configure ; make ; make install
编译安装 PostGIS
先安装依赖包, 安装原则如下:能用 yum 先用 yum 安装;不能 yum 安装就 rpm 包安装;没有 rpm 包,再编译安装.
当前版本对应官网 RPM 包安装路径如下:
安装 libxml2
编译 PG 的之前已经安装了
[root@openEuler ~]# rpm -qa |grep xml
libxml2-2.9.12-15.oe2203.aarch64
libxml2-devel-2.9.12-5.oe2203.aarch64
安装 protobuf-c
直接去官网镜像站点下载并安装 protobuf 与 protobuf-c(依赖于 protobuf)
[root@openEuler ~]# rpm -qa |grep protobuf
protobuf-3.9.0-7.oe1.aarch64
protobuf-devel-3.9.0-7.oe1.aarch64
protobuf-c-1.3.2-2.oe1.aarch64
protobuf-c-devel-1.3.2-2.oe1.aarch64
安装 json-c
由于环境中已经存在 json-c 0.15
[root@openEuler ~]# rpm -qa |grep json-c
json-c-0.15-2.oe2203.aarch64
而官网中默认的 json-c 0.13
所以最好是安装 json-c-devel-0.15 以及 json-c-0.15的 rpm 包rpm -Uvh json-c-0.15-6.oe2203.aarch64.rpm
rpm -Uvh json-c-devel-0.15-6.oe2203.aarch64.rpm
安装 sqlite-3 (因为 proj 会依赖于该库)
环境中已经存在更新的版本 sqlite-3.37.2-5.oe2203.aarch64, 所以我们只安装 sqlite-devel-3.36.0-2.oe2203.aarch64.rpm
[root@openEuler other_deps]# rpm -Uvh sqlite-3.36.0-2.oe2203.aarch64.rpm
Verifying... ################################# [100%]
Preparing... ################################# [100%]package sqlite-3.37.2-5.oe2203.aarch64 (which is newer than sqlite-3.36.0-2.oe2203.aarch64) is already installed
[root@openEuler other_deps]# rpm -Uvh sqlite-devel-3.36.0-2.oe2203.aarch64.rpm
error: Failed dependencies:sqlite(aarch-64) = 3.36.0-2.oe2203 is needed by sqlite-devel-3.36.0-2.oe2203.aarch64
[root@openEuler other_deps]# rpm -qa |grep sqlite
sqlite-3.37.2-5.oe2203.aarch64
[root@openEuler other_deps]# rpm -Uvh sqlite-devel-3.36.0-2.oe2203.aarch64.rpm --nodeps
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...1:sqlite-devel-3.36.0-2.oe2203 ################################# [100%]
[root@openEuler other_deps]#
安装 libtiff, libcurl,mpfr 等库(proj会依赖该库)
[root@openEuler other_deps]# rpm -Uvh libtiff-4.3.0-9.oe2203.aarch64.rpm
Verifying... ################################# [100%]
Preparing... ################################# [100%]package libtiff-4.3.0-24.oe2203.aarch64 (which is newer than libtiff-4.3.0-9.oe2203.aarch64) is already installed
[root@openEuler other_deps]# rpm -Uvh libtiff-devel-4.3.0-9.oe2203.aarch64.rpm
error: Failed dependencies:libtiff = 4.3.0-9.oe2203 is needed by libtiff-devel-4.3.0-9.oe2203.aarch64
[root@openEuler other_deps]# rpm -Uvh libtiff-devel-4.3.0-9.oe2203.aarch64.rpm --nodeps
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...1:libtiff-devel-4.3.0-9.oe2203 ################################# [100%]
[root@openEuler other_deps]# Verifying... ################################# [100%]
Preparing... ################################# [100%]package mpfr-4.1.0-1.oe2203.aarch64 is already installed
[root@openEuler ~]# rpm -Uvh mpfr-devel-4.1.0-1.oe2203.aarch64.rpm
error: Failed dependencies:gmp-devel is needed by mpfr-devel-4.1.0-1.oe2203.aarch64
[root@openEuler ~]# rpm -Uvh mpfr-devel-4.1.0-1.oe2203.aarch64.rpm --nodeps
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...1:mpfr-devel-4.1.0-1.oe2203 ################################# [100%]
[root@openEuler ~]#
[root@openEuler ~]# rpm -Uvh libjpeg-turbo-2.1.1-1.oe2203.aarch64.rpm
Verifying... ################################# [100%]
Preparing... ################################# [100%]package libjpeg-turbo-2.1.1-2.oe2203.aarch64 (which is newer than libjpeg-turbo-2.1.1-1.oe2203.aarch64) is already installed
[root@openEuler ~]# rpm -Uvh libjpeg-turbo-devel-2.1.1-1.oe2203.aarch64.rpm --nodeps
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...1:libjpeg-turbo-devel-2.1.1-1.oe220################################# [100%]
[root@openEuler ~]# rpm -Uvh libcurl-7.79.1-2.oe2203.aarch64.rpm
error: Failed dependencies:libcurl = 7.79.1-15.oe2203 is needed by (installed) curl-7.79.1-15.oe2203.aarch64
[root@openEuler ~]# rpm -Uvh libcurl-7.79.1-2.oe2203.aarch64.rpm --nodeps
Verifying... ################################# [100%]
Preparing... ################################# [100%]package libcurl-7.79.1-15.oe2203.aarch64 (which is newer than libcurl-7.79.1-2.oe2203.aarch64) is already installed
[root@openEuler ~]# rpm -qa |grep libcurl
libcurl-7.79.1-15.oe2203.aarch64
[root@openEuler ~]# rpm -Uvh libcurl-devel-7.79.1-2.oe2203.aarch64.rpm
error: Failed dependencies:libcurl = 7.79.1-2.oe2203 is needed by libcurl-devel-7.79.1-2.oe2203.aarch64
[root@openEuler ~]# rpm -Uvh libcurl-devel-7.79.1-2.oe2203.aarch64.rpm --nodeps
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...1:libcurl-devel-7.79.1-2.oe2203 ################################# [100%]
[root@openEuler ~]# rpm -qa |grep libcurl
libcurl-7.79.1-15.oe2203.aarch64
libcurl-devel-7.79.1-2.oe2203.aarch64
安装 proj
proj9 开始使用的是 cmake , 他会依赖于 googletest, 需要手动下载并编译安装 googletest, 比较麻烦
而 proj9 之前的版本可以使用 三板斧 configure;make;make install, 比较方便些
mkdir -p /usr/local/proj-8.2.1
# 如果只想编译动态库
./configure --prefix=/usr/local/proj-8.2.1
# 如果想编译出静态库(也包含动态库)
./configure --prefix=/usr/local/proj-8.2.1 --enable-static CFLAGS='-fPIC' CXXFLAGS='-fPIC'
make -j $(nproc) && make install最终打印如下:
。。。
make[2]: Nothing to be done for 'install-exec-am'./usr/bin/mkdir -p '/usr/local/proj-8.2.1/share/doc/proj'/usr/bin/install -c -m 644 COPYING NEWS AUTHORS '/usr/local/proj-8.2.1/share/doc/proj'/usr/bin/mkdir -p '/usr/local/proj-8.2.1/lib/pkgconfig'/usr/bin/install -c -m 644 proj.pc '/usr/local/proj-8.2.1/lib/pkgconfig'
make[2]: Leaving directory '/root/other_deps/p`在这里插入代码片`roj-8.2.1'
make[1]: Leaving directory '/root/other_deps/proj-8.2.1'
[root@openEuler proj-8.2.1]# ll /usr/local/proj-8.2.1/
total 16
drwxr-xr-x 2 root root 4096 Jun 14 17:22 bin
drwxr-xr-x 3 root root 4096 Jun 14 17:22 include
drwxr-xr-x 3 root root 4096 Jun 14 17:22 lib
drwxr-xr-x 5 root root 4096 Jun 14 17:22 share
安装 geos
cd /root/other_deps/geos-3.12.1
mkdir build
cd build# 指定安装路径,如果只想编译动态库, 命令如下
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/geos-3.12.1# 指定安装路径, 如果只想编译静态库, 命令如下
cmake -DBUILD_SHARED_LIBS=OFF .. -DCMAKE_INSTALL_PREFIX=/usr/local/geos-3.12.1# 编译与安装
cmake --build . -j $(nproc) && cmake --build . --target install -j $(nproc)# 查看结果
[root@openEuler build]# ll /usr/local/geos-3.12.1/lib64/
total 10096
drwxr-xr-x 3 root root 4096 Jun 14 21:28 cmake
-rw-r--r-- 1 root root 9740942 Jun 14 21:25 libgeos.a
-rw-r--r-- 1 root root 585120 Jun 14 21:25 libgeos_c.a
drwxr-xr-x 2 root root 4096 Jun 14 21:28 pkgconfig
可以看到只有静态库如果没有指定自定义目录, 默认是安装在了 /usr/local/lib64 下
[root@openEuler build]# ll /usr/local/lib64/*geos*
lrwxrwxrwx 1 root root 17 Jun 14 17:39 /usr/local/lib64/libgeos.so -> libgeos.so.3.12.1
-rwxr-xr-x 1 root root 3879856 Jun 14 17:31 /usr/local/lib64/libgeos.so.3.12.1
lrwxrwxrwx 1 root root 14 Jun 14 17:39 /usr/local/lib64/libgeos_c.so -> libgeos_c.so.1
lrwxrwxrwx 1 root root 19 Jun 14 17:39 /usr/local/lib64/libgeos_c.so.1 -> libgeos_c.so.1.18.1
-rwxr-xr-x 1 root root 408360 Jun 14 17:32 /usr/local/lib64/libgeos_c.so.1.18.1
[root@openEuler build]#
安装 gdal
安装指导参考: https://gdal.org/build_hints.html
必须项如下:
这里我使用 GDAL 3.8.0
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/gdal-3.8.0
cmake --build . -j $(nproc)
cmake --build . --target instasll -j $(nproc)
安装 PostGIS
安装 PostGIS 3.4.1
export PATH=/home/postgres/pgsql/bin:$PATH./configure \
--with-pgconfig=/home/postgres/pgsql/bin/pg_config \
--with-geosconfig=/usr/local/geos-3.12.1/bin/geos-config \
--with-gdalconfig=/usr/local/gdal-3.8.0/bin/gdal-config \
--with-projdir=/usr/local/proj-8.2.1make -j $(nproc)
make install
注意事项
- 最终打包的时候,如果要在 windows 环境上库, 尽量使用压缩包整体上库
- 如果使用的是解压之后的单个文件的上库, 这样会存在链接失效问题 (需要手工修改 jenkins 编译脚本来添加链接代码)
- 可能会出现 时区等类型的文件出现文件大小变为 0 的问题