使用ARSperl时,DynaLoader.pm检测到Perl undefined yp_get_default_domain,但库存在

时间:2014-08-07 05:59:56

标签: perl perl-module undefined-symbol

我有一个Ubuntu服务器,当我安装cpanminus时,最近将Perl更新推送到5.14.2。这破坏了与BMC Remedy API模块的兼容性。看起来我无法回滚到旧版本的Perl,所以我尝试重新编译ARSperl for Perl 5.14.2。

问题是,当我运行使用旧模块的旧Perl脚本时,我得到以下内容:

Can't load '/usr/local/lib/perl5/5.14.2/auto/ARS/ARS.so' for module ARS:
/usr/local/lib/perl5/5.14.2/auto/ARS/ARS.so: undefined symbol:
yp_get_default_domain at /usr/local/lib/perl5/5.14.2/i686-linux/DynaLoader.pm line 190.

所以,一些谷歌搜索告诉我yp_get_default_domain存在于libnsl中。我已经尝试重新编译ARSperl模块和Perl本身,并在Makefile中显式调用“-lnsl”。不幸的是,这让我无处可去。该库确实安装在/ usr / lib / i386-linux-gnu /上的系统上。

在ARSperl Makefile中:

LDFLAGS = -fstack-protector -L/usr/local/lib -L/usr/lib -L/usr/lib/i386-linux-gnu -lnsl

因此,对于那里的Perl大师来说,我的问题是双重的。

- 如何确定Perl,DynaLoader或ARS.so本身找不到“yp_get_default_domain”?

- 对于实际存在于系统中并在模块中链接的缺失库,对上述DynaLoader消息进行故障排除的最佳下一步是什么?

提前感谢您分享您的知识和建议。

2 个答案:

答案 0 :(得分:0)

将安装库的目录添加到Makefile.PL

中的$ ARS_LDPATH

这样的东西
$ARSAPI      = "C:\\ARS_Library\\api764win";

if( $WINDOWS ){
  $ARS_LDPATH = qq{-L"$ARSAPI/lib"};
  $INCLUDES   = qq{-I"$ARSAPI/include"};
}else{
  $ARS_LDPATH = "-L$ARSAPI/lib";
  $INCLUDES   = "-I$ARSAPI/include";
}

答案 1 :(得分:0)

我们更新到ARSperl 1.93,开始使用AR API版本6.3而不是5.1.2,并在6.3节中将“-lsnl”添加到ARSperl Makefile.PL $ ARS_LIBS。

每次运行ARS.so模块时都会导致Perl segfaulting。经过大量测试并尝试诊断为什么会发生段错误,我们从/ opt /中的源代码重新编译了一个单独的Perl-5.14.2实例,并删除了64int选项。在所有需要ARS模块重定向到/ opt下的Perl版本的Perl脚本上更新shebang行似乎已经让事情重新开始了。

感谢Chankey Pathak将我指向Makefile.PL,如果没有这个建议,我不会立即开始考虑改变它们。