第一次部署postgis差点安装到怀疑人生,弄了整整两个星期,过于丢人因此写个安装记录。
先说说自己的系统版本 cat /etc/os-release
NAME="OpenCloudOS" VERSION="8.10" ID="opencloudos" ID_LIKE="rhel fedora" VERSION_ID="8.10" PLATFORM_ID="platform:oc8" PRETTY_NAME="OpenCloudOS 8.10"
ANSI_COLOR="0;31" CPE_NAME="cpe:/o:opencloudos:opencloudos:8" HOME_URL="https://www.opencloudos.org/" BUG_REPORT_URL="https://bugs.opencloudos.tech/"
最重要的第一步更新yum和安装仓库
腾讯云服务器的用这个网站云服务器 CentOS 环境下通过 YUM 安装软件-运维指南-文档中心-腾讯云 (tencent.com)
如果没有dnf的yum install dnf 试试,不行就用yum安装下面的东西
# 启用 PowerTools 仓库
sudo dnf install dnf-plugins-core
sudo dnf config-manager --set-enabled powertools
# 安装 EPEL 仓库
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# 验证 EPEL 仓库
sudo dnf repolist
这些仓库配置文件在目录/etc/yum.repos.d下,如果手动添加后,刷新加载遇到报错直接把对应的文件删了就行。
这个是postgis的官方仓库可以手动添加,但是我会报错所以没法用这个安装。
[pgdg14]
name=PostgreSQL Global Development Group
baseurl=https://download.postgresql.org/pub/repos/yum/14/redhat/rhel-8-x86_64/
enabled=1
gpgcheck=1
gpgkey=https://download.postgresql.org/pub/repos/yum/RPM-GPG-KEY-PGDG
[pgdg12]
name=PostgreSQL Global Development Group - 12
baseurl=https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-8-x86_64/
enabled=1
gpgcheck=1
gpgkey=https://download.postgresql.org/pub/repos/yum/RPM-GPG-KEY-PGDG
[pgdg13]
name=PostgreSQL Global Development Group - 13
baseurl=https://download.postgresql.org/pub/repos/yum/13/redhat/rhel-8-x86_64/
enabled=1
gpgcheck=1
gpgkey=https://download.postgresql.org/pub/repos/yum/RPM-GPG-KEY-PGDG
如果能用这个安装成功那再好不过,不能就只能苦兮兮的用源码安装
仓库刷新命令
sudo dnf clean all && sudo dnf makecache
使用过的安装教程
Linux安装PostGresql_linux查看pg安装位置-CSDN博客
win、linux环境下JAVA+GDAL部署,jar包启动,相关描述,问题解决_no gdalalljni in java.library.path-CSDN博客
Postgresql 12.2 + PostGIS 3.0.1 安装部署_postgis安装教程-CSDN博客
检查PostGIS、PostgreSQL、GEOS、GDAL、PROJ等各软件的版本依赖关系_postgis版本对应关系-CSDN博客
PostgreSQL 12.5+ PostGIS3.0 + SFCGAL1.3的离线编译安装-CSDN博客
postgresql | 数据库 | centos7 完全离线安装postgresql12.5和postgis3.0插件教程_pg数据库下载-CSDN博客
PostGIS2.4服务器编译安装_postgis2.4.2-CSDN博客
一个查看各种版本是否兼容的网站
UsersWikiPostgreSQLPostGIS – PostGIS
准备工作差不多就是这些,直接说第一个遇到的问题,也是最重要的
问题1 在安装postgis后,往数据库添加postgis报错 libgeos_c.so.1: cannot open shared object file
意思是找不到这个文件,解决方法是复制粘贴即可
第一步
find / -name "libgeos_c.so.1" 2>/dev/null
搜索
第二步将/usr/local/lib目录下的那个直接复制粘贴,比如我的报错中说没有这个文件的目录是在/usr/local/pgsql/plugin/geos/lib,那么直接复制粘贴到这里,放心如果有其他报错直接删了就行。
如果你没有这个东西,可能是postgis安装有错误,检查一下或者重新安装
这个问题衍生出来的第二个问题是我弄了两个星期的罪魁祸首
问题2 添加libgeos_c.so.1的软连接后报错ERROR: could not load library "/home/postgres/lilb/postgis-3.so": /home/postgres/lib/postgis-3.so: undefined symbol.
GEOSCoverageSimplifyVW
这个软连接,我理解的意思是让程序访问libgeos_c.so.1时能转到我们希望他访问的文件
先放代码,删除现有的软链接
sudo rm libgeos_c.so.1
创建新的软链接,这个的意思是程序访问libgeos_c.so.1时能转到libgeos_c.so.1.10.2,就是因为这个才导致的错误
sudo ln -s /usr/local/pgsql/plugin/geos/lib/libgeos_c.so.1.10.2 libgeos_c.so.1
我一开始以为是版本不兼容的问题,开始各种换版本,说多了都是泪,接下来遇到的问题就是安装gdal,geos,proj等遇到的问题,具体的细节感觉没必要说,因都是对那几个文件进行修改
安装postgis依赖的注意事项
1.在服务器根目录下有以下两个配置文件/etc/ld.so.conf,/etc/profile。
在安装依赖和postgis时就是从这里头检索需要的文件,贴上自己的以供参考。
比如postgis安装报错说找不到gdal,checking for library containing GDALAllRegister... no configure: error: could not find GDAL。那就往这两个文件里添加安装目录,这个安装目录是填你自己的。
/usr/local/pgsql/plugin/gdal/lib
export GDAL_HOME=/usr/local/gdal
export GDAL_DATA=$GDAL_HOME/share/gdal
记得在修改这两个文件后需要进行刷新
修改 /etc/ld.so.conf 后刷新
sudo ldconfig
修改 /etc/profile 后刷新
source /etc/profile
因为我安装了很多个版本所以这个内容有点乱,仅以供参考,有些目录有$,比如$PKG_CONFIG_PATH,这个意思是调用自己,这样可以方便加注释
include ld.so.conf.d/*.conf
/home/postgres/lib
/usr/local/pgsql/plugin/gdal/lib
/usr/local/pgsql/plugin/geos/lib
/usr/local/pgsql/plugin/proj/lib
/home/postgres/share/extension
/home/postgres/data/usr/local/lib
/usr/local/pgsql/plugin/geos-3.12.2/lib
/usr/local/lib
/usr/local/lib64
# Set SQLite environment variables
export SQLITE3=/usr/local/sqlite
export PATH=$SQLITE3/bin:$PATH
export PKG_CONFIG_PATH=/usr/local/sqlite/lib/pkgconfig:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib64/pkgconfig:/usr/local/gdal/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:/usr/lib64/pkgconfig:/usr/local/pgsql/plugin/proj/lib/pkgconfig:/usr/local/pgsql/plugin/gdal/lib/pkgconfig
# Set LD_LIBRARY_PATH for SQLite and other libraries
export LD_LIBRARY_PATH=/home/postgres/lib:/usr/local/lib:/usr/local/lib64:/usr/local/include:/usr/local/include/geos:/usr/local/pgsql/plugin/gdal-3.9.2/build:/usr/local/gdal/lib64:/usr/lib64:/usr/lib:/usr/local/pgsql/plugin
# Set Java environment variables
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
# Set PostgreSQL environment variables
export PGHOME=/home/postgres
export PATH=$PGHOME/bin:$PATH
export PGDATA=/home/postgres/data
# Ensure all necessary paths are included in PATH
export PATH=$PATH:$PGHOME/bin:$PGDATA
# Set GDAL environment variables
# Uncomment the following lines if needed
export GDAL_HOME=/usr/local/gdal
export GDAL_DATA=$GDAL_HOME/share/gdal
export LD_LIBRARY_PATH=$GDAL_HOME/lib:$LD_LIBRARY_PATH
# export PATH=$GDAL_HOME/bin:$PATH
export PATH=$PATH:/usr/local/bin:/usr/local/gdal/bin
# Finalize PATH and LD_LIBRARY_PATH
export PATH
export LD_LIBRARY_PATH
# Set CPPFLAGS and LDFLAGS for GEOS
#export CPPFLAGS="$CPPFLAGS -I/usr/local/include"
#export LDFLAGS="$LDFLAGS -L/usr/local/lib64"
export LDFLAGS="-L/usr/local/lib -L/usr/local/lib64 -L/usr/lib64 -L/usr/local/gdal/lib -L/usr/local/gdal/lib64 -L/usr/local/pgsql/plugin/proj/lib -L/usr/local/pgsql/plugin/gdal/lib"
export CPPFLAGS="-I/usr/local/include -I/usr/include -I/usr/local/gdal/include -I/usr/local/pgsql/plugin/proj/include -I/usr/local/pgsql/plugin/gdal/include"
2.查看postgis安装日志寻找缺少文件
这个目的是看看除了给的报错外,到底缺少什么文件,查询命令
grep -i "needed by" config.log
这个意思是查询关键词needed by,这个关键词后面跟着的往往就是缺少的文件,比如/usr/bin/ld: warning: libpq.so.5, needed by /usr/lib64/libgdal.so, not found。这个意思不一定是整个服务器里都没有,而且在这个目录下找不到,所以使用查找命令让后复制粘贴
find / -name 'libhdf5.so.6'
也可以试试这个,有更具体的报错grep -i "error" config.log
3.安装报错-fPIC
_ZTVN4geos5index8quadtree4NodeE' can not be used when making a shared object; recompile with -fPIC /usr/bin/ld: /usr/local/lib/libgeos.a(lt1-Key.o): relocation R_X86_64_32 against.bss' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output collect2: error: ld returned 1 exit status
make[1]: *** [GNUmakefile:56: libgdal.la] Error 1
make[1]: Leaving directory '/usr/local/pgsql/plugin/gdal-2.1.2' make: *** [GNUmakefile:65: check-lib] Error 2
这个错误信息表明在编译 GDAL 时遇到了与 libgeos.a 静态库相关的链接问题。具体来说,静态库中的某些对象文件没有使用 -fPIC(Position-Independent Code)编译,因此无法用于构建共享对象(即 .so 文件)。为了解决这个问题,需要确保 GEOS 库是以 -fPIC 方式编译的。(通义灵码ai给的解答)
重新安装一遍即可,非gdal的其他同理,记得先make clean把之前的给清空
./configure --enable-pic
make
sudo make install
4.报错找不到geo.pc
[root@VM-12-10-opencloudos geos-3.6.2]# find /usr/local/lib/pkgconfig /usr/lib/pkgconfig -name "geo.pc" find: ‘/usr/lib/pkgconfig’: No such file or directory [root@VM-12-10-opencloudos geos-3.6.2]#
第一步先确认这个文件存不存在 find / -name geos.pc 2>/dev/null
第二步确认有了之后你得让系统知道路径,修改/etc/profile,目录改成你自己的
export PKG_CONFIG_PATH=/path/to:$PKG_CONFIG_PATH
改完记得刷新文件source /etc/profile。
geo.pc文件内容示例
prefix=/usr/local
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib64
Name: GEOS
Description: Geometry Engine, Open Source - C API
Requires:
Version: 3.6.2
Cflags: -I${includedir}
Libs: -L${libdir} -lgeos_c
Libs.private: -lgeos -lstdc++ -lm
5.postgis安装报错proj4
Using user-specified proj directory: /usr/local/pgsql/plugin/proj checking for proj_api.h... yes
checking for pj_get_release in -lproj... no
configure: error: could not find libproj - you may need to specify the directory of a PROJ.4 installation using --with-projdir
第一步确认libproj版本: ls /usr/local/pgsql/plugin/proj/lib/
确认 proj_api.h 头文件: ls /usr/local/pgsql/plugin/proj/include/proj_api.h
目录换成你自己的,如果没有看看是不是目录错了,实在找不到就重新安装
第二步创建必要的符号链接, 确保 libproj.so 指向正确的版本,以我自己为例
sudo ln -s /usr/local/pgsql/plugin/proj/lib/libproj.so.15 /usr/local/pgsql/plugin/proj/lib/libproj.so
sudo ln -s /usr/local/pgsql/plugin/proj/lib/libproj.so.15 /usr/local/pgsql/plugin/proj/lib/libproj.so.15
当然创软连接有可能会遇到这个错误说重复,不慌删了就是,然后重新创建
'/usr/local/pgsql/plugin/proj/lib/libproj.so.15': Too many levels of symbolic links [root@VM-12-10-opencloudos postgis-2.4.9]#
sudo rm -f /usr/local/pgsql/plugin/proj/lib/libproj.so
sudo rm -f /usr/local/pgsql/plugin/proj/lib/libproj.so.12
sudo rm -f /usr/local/pgsql/plugin/proj/lib/libproj.so.12.0.0
sudo rm -f /usr/local/pgsql/plugin/proj/lib/libproj.so.15
6总结
只要是在postgis安装时遇到说找不到什么什么的,第一个查看/etc/ld.so.conf,/etc/profile.看看这两个文件里有没有包含你安装的依赖,第二个就是看软连接有没有,列出符号连接的代码
ls -l /usr/local/pgsql/plugin/proj/lib
能力有限也没有办法给很具体的解决办法,只能给一个解决的思路