首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl/Postgresql: plperl.so未定义符号: Perl_sv_2bool_flags

Perl/Postgresql: plperl.so未定义符号: Perl_sv_2bool_flags
EN

Stack Overflow用户
提问于 2014-09-10 21:53:22
回答 1查看 1.2K关注 0票数 2

这是我在这里的第一篇帖子,如果我没有提供第一次所需的所有信息,非常抱歉!

我的老板和我一直试图在我们的一台服务器(Centos 6.5,postgres 9.2.1,Perl 5.10.1)上的Postgres安装上安装plperl,但我们一直遇到相同的问题,如下所示:

代码语言:javascript
复制
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安装语言(create language plperl;)时,会返回此错误。

我已经检查了我们在/opt/PostgreSQL/9.2/lib/postgresql/中有一个lperl.so文件,并且像大多数关于这个问题的帖子所建议的那样寻找libperl.so。我试过在很多不同的地方放置libperl.so,因为每个人和他的狗都有不同的建议,关于它应该放在哪里。

运行ldd /opt/PostgreSQL/9.2/lib/postgresql/plperl.so将返回以下内容:

代码语言:javascript
复制
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和Perl 5.10.1的服务器,pl/perl运行得很好(我也试着看看发生了什么,以解决这个问题,但无法解决)。

据我所知,Postgres希望libperl.so安装在/lib64中,但是当安装Perl时,它被安装在其他地方。目前,Postgres是唯一将使用libperl.so的东西。

不幸的是,我不知道所有的东西是如何安装在这台服务器上的,因为我的老板在我加入公司之前设置了所有的东西,他只是刚刚决定我们实际上需要让它正常工作。

从我们的两台服务器上看,我看不到任何安装和配置的差异,这会导致一个可以工作,一个不能工作。

我对此几乎束手无策(这是我们需要解决的Postgres安装的最后一个问题),所以任何建议都将不胜感激。

干杯

EN

回答 1

Stack Overflow用户

发布于 2014-09-10 22:41:33

您是否正在使用与包管理器一起安装的二进制包,该包管理器可以正确控制依赖关系?是你自己编译的库吗?虽然可以使用图形用户界面“管理”工具强制安装二进制包,或者将文件放在PostgreSQL能够找到它们的位置,但如果它们没有在合理相似的平台上编译/链接,就不应该期望它们能正常工作。

看起来您使用的Perl版本在编译时使用了与正在安装的plperl.so文件不同的标志或选项。看看perl -V的输出,看看它是如何编译的--一致地使用线程选项是很重要的。

/opt/PostgreSQL/9.2/lib/postgresql/plperl.so告诉你它的一个符号是未定义的。这可能是由于编译选项的原因,也可能意味着您需要较新版本的Perl和libperl.so (5.10.1是相当旧的版本)。最新版本的PotgreSQL和plperl通常需要比您引用的版本更高的perl版本。

libperl.so应该安装在您的平台和其他已编译/链接使用它的应用程序的一致位置-您不应该需要移动它。实际上,如果您的系统上有大量的libperl.so副本,plperl在加载时可能会发现一个过时的libperl.so版本。

为了进行比较,下面是您在我的一个系统上运行的命令的输出:

代码语言:javascript
复制
/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)

符号存在:

代码语言:javascript
复制
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上用来管理这一点的工具。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25767279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档