我有一个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消息进行故障排除的最佳下一步是什么?
提前感谢您分享您的知识和建议。
答案 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,如果没有这个建议,我不会立即开始考虑改变它们。