sql - Perl/Postgresql : plperl. 所以 undefined symbol :Perl_sv_2bool_flags

标签 sql perl postgresql plperl

这是我在这里的第一篇文章,如果我第一次没有提供所需的所有信息,我深表歉意!

我的老板和我一直在尝试在我们的一台服务器(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。所以正如大多数与此问题相关的帖子所暗示的那样。我试过将 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 和 Perl 5.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 上管理它的工具。

关于sql - Perl/Postgresql : plperl. 所以 undefined symbol :Perl_sv_2bool_flags,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25767279/

相关文章:

mysql - 调整数据库结构以支持过滤对话和删除对话

perl - 在 perl 模块中使用 sigtrap,如何在对象上下文中接收到陷阱?

用于选择查询列表的 SQL 表列值

Mysql 多对多连接

sql - PL/SQL 包自动化测试

sql - Hive 查询记录处理计数

java - 是否可以在 @Formula 上使用具有 boolean 字段来比较日期的表达式逻辑?

multithreading - 线程/ fork 的效率

perl - Xpath 找不到 id

postgresql - 如何从 clojure.java.jdbc 删除或创建数据库?