这是我在这里的第一篇文章,如果我第一次没有提供所需的所有信息,很抱歉!
我的老板和我一直试图在我们的一台服务器(Centos 6.5、postgres 9.2.1、Perl 5.10.1)上的postgres安装上安装plperl,但我们一直遇到同样的问题,如下所示:
ERROR: could not load library "/opt/PostgreSQL/9.2/lib/postgresql/plperl.so":
/opt/PostgreSQL/9.2/lib/postgresql/plperl.so: undefined symbol: Perl_sv_2bool_flags
当我们尝试通过SQL或使用PgAdmin III GUI安装该语言(创建语言plperl;)时,会返回此错误。
我已经检查了我们在/opt/PostgreSQL/9.2/lib/postgresql/
中是否有一个lperl.so
文件,并像大多数关于这个问题的帖子所建议的那样寻找libperl.so
。我试过把libperl.so
放在很多不同的地方,因为每个人和他的狗对它应该放在哪里都有不同的建议。
运行ldd /opt/PostgreSQL/9.2/lib/postgresql/plperl.so
返回以下内容:
ldd /opt/PostgreSQL/9.2/lib/postgresql/plperl.so
linux-vdso.so.1 => (0x00007fff2d9b7000)
libperl.so => /lib64/libperl.so (0x00007f8ab5c11000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f8ab59f3000)
libc.so.6 => /lib64/libc.so.6 (0x00007f8ab565f000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f8ab5445000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f8ab522b000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f8ab5027000)
libm.so.6 => /lib64/libm.so.6 (0x00007f8ab4da3000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f8ab4b6b000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f8ab4968000)
/lib64/ld-linux-x86-64.so.2 (0x00000034aa800000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f8ab46f1000)
我不认为Postgres和Perl的版本是个问题,因为我们有另一台运行Centos 6.5、Postgres 9.3和Perl5.10.1的服务器,pl/Perl运行得很好(我也试过看看那里发生了什么来解决这个问题,但无法解决)。
据我所知,Postgres希望libperl.so在/lib64中,但当安装Perl时,它安装在其他地方。目前Postgres是唯一一个将使用libperl.so 的东西
不幸的是,我不知道这台服务器上的所有东西是如何安装的,因为我的老板在我加入公司之前就已经设置好了,他只是刚刚决定我们真的需要让它工作起来。
从我们的两台服务器来看,我看不出安装和配置有任何差异,这会导致一台工作,一台不工作。
我对此束手无策(这是我们安装Postgres时需要解决的最后一个问题),所以任何建议都将不胜感激。
干杯
您是否使用安装有包管理器的二进制包来正确控制依赖关系?你自己在编译库吗?虽然可以强制二进制包使用GUI"管理"工具安装,或者将文件放置在PostgreSQL能够找到它们的位置,但如果它们没有在相当相似的平台上编译/链接,则不应该期望它们正常工作。
看起来您使用的Perl版本使用的标志或选项与您安装的plperl.so
文件不同。看看perl -V
的输出,看看perl是如何编译的——线程选项的一致使用很重要。
/opt/PostgreSQL/9.2/lib/postgresql/plperl.so
告诉你它的一个符号是未定义的。这可能是由于编译选项的原因,也可能意味着您需要更新版本的Perl和libperl.so
(5.10.1相当旧)。PotgreSQL和plperl
的最新版本通常需要比您引用的版本更新的perl
。
libperl.so
应该安装在一个一致的位置,以便您的平台和其他已编译/链接使用它的应用程序使用——您不需要四处移动它。事实上,如果您的系统上有许多libperl.so
的副本,plperl
在加载时可能会发现libperl.so
的版本已过时。
为了进行比较,这里是您在我的一个系统上运行的命令的输出:
/usr/local/lib/postgresql/plperl.so:
libperl.so => /usr/local/lib/perl5/5.16/mach/CORE/libperl.so (0x801214000)
libthr.so.3 => /lib/libthr.so.3 (0x80158f000)
libc.so.7 => /lib/libc.so.7 (0x80081b000)
libm.so.5 => /lib/libm.so.5 (0x8017b2000)
libcrypt.so.5 => /lib/libcrypt.so.5 (0x8019d3000)
libutil.so.9 => /lib/libutil.so.9 (0x801bf2000)
符号存在:
strings /usr/local/lib/perl5/5.16/mach/CORE/libperl.so | grep 2bool
Perl_sv_2bool_flags
Perl_sv_2bool
很可能在堆栈中的某个位置有一个perl
XS模块或一个指向错误位置的.so
文件。也许缓存库在系统级别存在一些混淆。。。我相信ldconfig
是您在Linux上用来管理此问题的工具。