安装PostGIS扩展到PostgreSQL数据库时出现错误

3
我遇到了安装postgis到现有数据库的问题。但是出现以下错误:
ERROR:  could not load library "/usr/local/pgsql/lib/postgis-2.0.so": libgeos_c.so.1: cannot open shared object file: No such file or directory
/usr/local/pgsql/lib/postgis-2.0.so中有postgis-2.0.so,没有问题。/usr/local/lib中已安装libgeos_c.so.1

那么问题出在哪里呢?

任何帮助都将不胜感激。

谢谢。

顺便说一下,我按照此教程安装了所有这些:

http://www.codingsteps.com/installing-and-configuring-postgresql-in-amazon-linux-ami/

更新

$ ldd /usr/local/lib/libgeos_c.so.1
linux-vdso.so.1 =>  (0x00007fff6f55b000)
libgeos-3.3.7.so => /usr/local/lib/libgeos-3.3.7.so (0x00007f53700d9000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f536fdd0000)
libm.so.6 => /lib64/libm.so.6 (0x00007f536fb4c000)
libc.so.6 => /lib64/libc.so.6 (0x00007f536f7c0000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f536f5ab000)
/lib64/ld-linux-x86-64.so.2 (0x00007f537068d000)
7个回答

5
如果您是通过源代码安装PostGIS,可能会忘记运行sudo ldconfig。对我来说运行这个命令起到了作用!感谢Yunwei.W分享的维基百科内容!

1
这个对我来说救了命。 - Luv33preet

5
使用像Ubuntu、Debian、Fedora、RHEL等明智的Linux发行版要容易得多,然后只需使用相应的http://apt.postgresql.org/http://yum.postgresql.org/获取所有这些预构建并且易于安装的内容。亚马逊的PostgreSQL包装是不安全的且边缘不堪,应该避免使用。
我怀疑即时问题在于/usr/local/lib没有出现在LD_LIBRARY_PATH和/或/etc/ld.so.conf中,因此当PostgreSQL dlopen(...)postgis-2.0.so尝试解析libgeos_c.so.1时失败无法找到它。
另一个可能性是/usr/local/lib/libgeos_c.so.1是指向不存在文件的符号链接。

1
嗨,Craig,谢谢你的回复。我刚刚尝试了export LD_LIBRARY_PATH=/usr/local/lib,但好像没有起作用。有什么想法吗? - Yunwei.W
@Still.Wang 嗯,仅仅将环境变量导出到你的shell中并不会有任何区别,因为它只会在设置postgresql服务器进程的环境时才起作用。你需要修改postgresql的init脚本或将其添加到/etc/ld.so.conf中,以便全局影响每个程序。 - Craig Ringer
刚刚检查了一下文件,内容是 include ld.so.conf.d/*.conf /usr/local/lib - Yunwei.W
抱歉,我真的不是一个Linux专家。 :( - Yunwei.W
好的,你接下来通常要做的是运行 ldd /usr/local/lib/libgeos_c.so.1。看看是否有任何错误或缺失的依赖项。但是,如果你“不是真正的 Linux 专家”,你应该放弃这个虚拟机,并用一个好的明智的 Ubuntu 或 Fedora 虚拟机替换它,其中包括 PostGIS 等官方 PostgreSQL 包。你正在走一条艰难的路。 - Craig Ringer
如果运行ldconfig没有效果,我会尝试将strace连接到postgres后端,以查看动态链接器的确切操作,或启用LD_DEBUG。如果你是Linux新手,你不想去那里。现在是重新审视你对Amazon Linux使用的好时机。 - Craig Ringer

2
我好像不小心遇到了类似的问题。在Cent OS 6上,我从PostgreSQL YUM存储库安装了二进制的PostgreSQL 9.3。从官方稳定版本的tar中编译了GDAL库版本1.11.0。然后从原始的PostGIS存储库编译了PostGIS 2.1.4dev。单元测试显示,由于未找到,libgdal未被加载。错误信息看起来与原始问题相似。@Craig提出了使用strace的想法。关键是要将strace专门附加到客户端连接到DBMS后创建的进程上。在将strace附加到DBMS之后,让客户端要求服务器在当前数据库上CREATE EXTENSION postgis并查看strace的输出。在我的情况下,它给出了以下内容:
open("/lib64/tls/x86_64/libgdal.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64/tls/x86_64", 0x7fffefb20290) = -1 ENOENT (No such file or directory)
open("/lib64/tls/libgdal.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64/tls", {st_mode=S_IFDIR|0555, st_size=4096, ...}) = 0
open("/lib64/x86_64/libgdal.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64/x86_64", 0x7fffefb20290)   = -1 ENOENT (No such file or directory)
open("/lib64/libgdal.so.1", O_RDONLY)   = -1 ENOENT (No such file or directory)
stat("/lib64", {st_mode=S_IFDIR|0555, st_size=12288, ...}) = 0
open("/usr/lib64/tls/x86_64/libgdal.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/tls/x86_64", 0x7fffefb20290) = -1 ENOENT (No such file or directory)
open("/usr/lib64/tls/libgdal.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/tls", {st_mode=S_IFDIR|0555, st_size=4096, ...}) = 0
open("/usr/lib64/x86_64/libgdal.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/x86_64", 0x7fffefb20290) = -1 ENOENT (No such file or directory)
open("/usr/lib64/libgdal.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64", {st_mode=S_IFDIR|0555, st_size=12288, ...}) = 0

这显示了DBMS尝试查找库的具体路径。在我的情况下,库位于/usr/local/lib/libgdal.so.1.18.0,并且在同一目录中使用符号链接进行更广泛的版本使用。我的解决方案是将这些文件的符号链接放入/usr/lib64目录中。


你能告诉我你是如何复制所有符号链接到目录的吗?在我的情况下,你似乎只有/lib64中的所有符号链接,但它们实际上位于不同的目录中,你对此有什么建议吗?我在这个过程中遇到了困难。 - AnkitSablok

1
自从我解决了这个问题后已经有一段时间了,几乎忘记了我之前提出的这个问题。我发现仍然会得到那些可能遇到此问题的人的点赞。
所以基本上,我发现这个问题可能是由于我通过“sudo apt-get install postgis”安装的postgis插件没有正确安装到PostgreSQl数据库首选的位置。我真的不是一个Linux专家来确保这一点。但似乎每次我尝试以这种方式安装postgis时,这个错误就会出现。 因此,解决此问题的方法是从源代码中下载、构建和安装postgis 我遵循了这个wiki。希望对某些人有所帮助。

1

/etc/ld.so.conf.d/ 应该包含 postgresql libs 目录和 geos libs 的路径。

在 Amazon Linux 上,postgresql 9.6.6 的示例:

-create postgresql-pgdg-libs.conf with "/usr/lib64/pgsql96/" path
-create libgeos.conf with "/usr/local/lib/" path 
-check the geos library present in 
 ldconfig -v | grep geos
- if yes compile the extension
sudo -u postgres -- psql -c "CREATE EXTENSION postgis;"

0
这个命令对我有效:
sudo ln -s /usr/lib/x86_64-linux-gnu/libgeos_c.so.1 /usr/lib/
这基本上是创建了一个符号链接到 Django 希望它所在的位置。默认情况下,libgeos_c.so.1 将安装在 /usr/lib/x86_64-linux-gnu 文件夹中。

0

如果有人在未来遇到类似问题,我也遇到了类似的问题(现在使用的是postgis 3.0.1),问题的根源是在AWS Linux 2上,我必须手动安装postgres的pgxs部分(以管理扩展),在安装过程中,./configure命令的一部分将库扩展的路径硬编码为/usr/lib64/perl5/CORE/(其中libperl.so位于此路径)。以下是configure命令:

(请看最后的参数)

/usr/lib64/pgsql/pgxs/src/Makefile.global:configure_args =  '--build=x86_64-koji-linux-gnu' '--host=x86_64-koji-linux-gnu' '--program-prefix=' '--disable-dependency-tracking' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' '--localstatedir=/var' '--sharedstatedir=/var/lib' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--disable-rpath' '--with-perl' '--with-tcl' '--with-tclconfig=/usr/lib64' '--with-ldap' '--with-openssl' '--with-pam' '--with-gssapi' '--with-ossp-uuid' '--with-libxml' '--with-libxslt' '--enable-nls' '--enable-dtrace' '--with-selinux' '--with-system-tzdata=/usr/share/zoneinfo' '--datadir=/usr/share/pgsql' '--with-systemd' '--with-icu' '--with-python' 'build_alias=x86_64-koji-linux-gnu' 'host_alias=x86_64-koji-linux-gnu' 'CFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Wl,-rpath=/usr/lib64/perl5/CORE/ -L/usr/lib64/perl5/CORE/' 'LDFLAGS=-Wl,-z,relro ' 'CXXFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic' 'PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig'

/usr/lib64/pgsql/pgxs/src/Makefile.global:CFLAGS = -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Wl,-rpath=/usr/lib64/perl5/CORE/ -L/usr/lib64/perl5/CORE/

总之,最终我通过@progalgo提到的strace弄明白了,当创建扩展时,postgis尝试使用的库存储在/usr/local/lib中,但是无论如何配置LD_LIBRARY_PATH环境变量都无法使其查找那里。因此,我将文件从perl文件夹移动到了/usr/local/lib中,删除了那个/CORE目录,并将"CORE"符号链接到了/usr/local/lib本身。有点hack-y,但它起作用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接