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

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

那么,这里有什么问题呢?

任何帮助,将不胜感激。

谢谢。

顺便说一句,我安装了所有这些,然后是本教程:

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)
4

7 回答 7

5

使用 Ubuntu、Debian、Fedora、RHEL 等合理的Linux 发行版要容易得多。然后您可以根据需要使用http://apt.postgresql.org/http://yum.postgresql.org/预先构建所有这些东西并且易于安装。亚马逊的 PostgreSQL 包装是不安全的,近乎无能,应该避免。

我怀疑直接的问题/usr/local/lib不是 onLD_LIBRARY_PATH和/或 in /etc/ld.so.conf,所以当 PostgreSQL尝试解决但找不到它时。dlopen(...)postgis-2.0.solibgeos_c.so.1

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

于 2013-07-29T04:22:32.227 回答
4

如果您通过源代码安装了 postgis,可能您忘记运行sudo ldconfig. 运行这个对我有用!

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

于 2017-06-14T14:08:29.160 回答
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目录中。

于 2014-05-29T07:42:44.097 回答
1

我已经有一段时间没有解决这个问题了,几乎忘记了我之前问过的这个问题。我发现仍然有可能遇到这个问题的人投赞成票。

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

所以解决这个问题的方法是,postgis从源代码下载、构建和安装。

我关注了这个维基。希望它对某人有帮助。

于 2013-12-14T20:22:23.667 回答
1

/etc/ld.so.conf.d/应该包含 postgresql libs dir 和 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;"
于 2017-12-08T20:36:43.963 回答
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文件夹中

于 2019-11-05T16:55:01.837 回答
0

如果它对将来的任何人有帮助,我有一个类似的问题(现在是 postgis 3.0.1),结果问题的根源是在 AWS Linux 2 上,我必须手动安装pgxspostgres 的一部分(管理扩展),并且在安装过程中,./configure命令的一部分硬编码了扩展库到/usr/lib64/perl5/CORE/(所在位置libperl.so)的路径。这是配置命令:

(见最后的参数)

/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 提到stracepostgis 试图使用的库(在创建扩展时)被安置在其中,/usr/local/lib但没有多少配置LD_LIBRARY_PATHenv 变量会使它看起来在那里。所以我将文件从 perl 文件夹移到 /usr/local/lib,删除了 /CORE 目录,并将“CORE”符号链接到 /usr/local/lib 本身。有点hack-y,但它有效。

于 2020-05-12T19:42:14.510 回答