我有一台Ubuntu服务器,当我安装cpanminus时,它最近将Perl更新推到了5.14.2。这破坏了与BMC Remedy API模块的兼容性。看起来我不能回滚到旧版本的Perl,所以我尝试重新编译ARSperl for Perl5.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。我甚至尝试用Makefile中显式调用的"-lnsl“重新编译ARSperl模块和Perl本身。不幸的是,这对我毫无帮助。该库实际上安装在系统的/usr/lib/i386-linux-gnu/下。
在ARSperl生成文件中:
LDFLAGS = -fstack-protector -L/usr/local/lib -L/usr/lib -L/usr/lib/i386-linux-gnu -lnsl
因此,对于Perl专家来说,我的问题是双重的。
-How我能确定Perl、DynaLoader或ARS.so本身中的哪一个找不到"yp_get_default_domain“吗?
对于系统中实际存在并链接到模块中的缺失库,解决上述DynaLoader消息的最佳下一步是使用-What吗?
提前感谢您分享您的知识和建议。
发布于 2014-08-07 14:39:53
将库的安装目录添加到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";
}发布于 2014-08-09 00:23:46
我们更新到了API1.93,开始使用AR ARSperl版本6.3而不是5.1.2,并在6.3的一节中向ARSperl Makefile.PL $ARS_LIBS添加了"-lsnl“。
这导致每次运行ARS.so模块时,Perl都会出现段错误。在进行了大量测试并尝试诊断为什么会发生段错误之后,我们从/opt/下的源代码中重新编译了一个单独的Perl-5.14.2实例,并删除了64int选项。在所有需要ARS模块重定向到/opt下的Perl版本的Perl脚本上,更新shebang行似乎又让事情恢复了正常。
感谢Chankey Pathak为我指明了Makefile.PL的方向,如果没有这个建议,我不会立即开始考虑改变那里的东西。
https://stackoverflow.com/questions/25175190
复制相似问题