将postgis扩展安装到postgresql数据库时出错

时间:2013-07-29 04:12:20

标签: postgresql postgis

我在将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

postgis-2.0.so在/usr/local/pgsql/lib/postgis-2.0.so没有问题。 libgeos_c.so.1安装在/usr/local/lib

那么,这里有什么问题?

任何帮助都将不胜感激。

感谢。

BTW,我安装了所有这些,然后是本教程:

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 个答案:

答案 0 :(得分:5)

方式更容易使用合理的Linux发行版,如Ubuntu,Debian,Fedora,RHEL等。您可以根据需要使用http://apt.postgresql.org/http://yum.postgresql.org/得到所有这些预先构建并易于安装的东西。亚马逊的PostgreSQL包装是unsafe bordering on incompetent,应该避免使用。

我怀疑当前问题是/usr/local/lib没有LD_LIBRARY_PATH和/或/etc/ld.so.conf,所以当PostgreSQL dlopen(...)的{​​{1}}试图解决postgis-2.0.so并找不到它。

另一种可能性是libgeos_c.so.1是指向不存在的文件的符号链接。

答案 1 :(得分: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文件夹。

答案 2 :(得分:1)

自从我解决了这个问题以来已经有一段时间了,几乎忘记了之前我问过的这个问题。我发现人们仍然可能会遇到这个问题。

基本上,我发现这个问题可能会发生,因为我postgis安装的sudo apt-get install postgis插件没有正确安装到PostgreSQl数据库首选的位置。我真的不是一个确保这一点的Linux人。但似乎每次我尝试以这种方式安装postgis时,此错误都会显示出来。

因此,解决此问题的方法是,从源代码下载,构建并安装postgis

我遵循了wiki。希望它对某人有所帮助。

答案 3 :(得分:1)

如果您按来源安装了postgis,可能忘了运行sudo ldconfig。运行这个对我有用!

谢谢Yunwei.W,我在你分享的wiki中看到了这个!

答案 4 :(得分:0)

/etc/ld.so.conf.d/应该包含postgresql libs dir和geos libs的路径。 在Amazon linux上的postgresql 9.6.6示例: 使用“/ usr / lib64 / pgsql96 /”路径创建postgresql-pgdg-libs.conf 使用“/ usr / local / lib /”路径创建libgeos.conf - 检查存在的地理库  ldconfig -v | grep geos - 如果是,请编译扩展名 sudo -u postgres - psql -c“CREATE EXTENSION postgis;”

答案 5 :(得分: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文件夹中

答案 6 :(得分:0)

如果将来对任何人有帮助,我也会遇到类似的问题(现在使用的是postgis 3.0.1),事实证明,问题的根源在于在AWS Linux 2上,我必须手动安装{{1 }}是postgres的一部分(用于管理扩展),在安装期间,pgxs命令的一部分硬编码了扩展库到./configure(其中/usr/lib64/perl5/CORE/所在的路径)的路径。这是configure命令:

(请参阅最后一个参数)

libperl.so

无论如何,我最终通过@progalgo对/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/ 的提及,发现postgis试图使用的库(在创建扩展名时)位于strace中,但是没有大量的配置/usr/local/lib env变量会使它看起来在那里。因此,我将文件从perl文件夹移至/ usr / local / lib,删除了/ CORE目录,并将“ CORE”符号链接到/ usr / local / lib本身。有点骇人听闻,但确实有效。