免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5308 | 回复: 11
打印 上一主题 下一主题

XSLoder.pm报错,求助! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-30 06:33 |只看该作者 |倒序浏览
报错消息如下:

object version 2.36 does not match bootstrap parameter %_ at /usr/local/lib/perl5/5.12.2/sun4-solaris/XSLoader.pm line 94.

我己经找到这个object是Digest::MD5.

这个Solaris 9的系统原来装的Digest::MD5版本是3.51,我尝试重新安装了Digest::MD5 3.53,仍然出现这条报错消息。

有高人告诉我这个和本地的C库有关系,但是本人愚笨,搞不太懂什么意思。 这个问题已经折磨了我快三天了,请各位帮助,谢谢!

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
2 [报告]
发表于 2013-10-30 06:35 来自手机 |只看该作者
你找到新的包路径加入环境变量?

论坛徽章:
0
3 [报告]
发表于 2013-11-01 07:28 |只看该作者
问题解决了,经过高人的指点,问题的根本原因是以前有人用cp把原始的perl执行文件拷贝到了另外一个路径,然后把这个路径加入到@INC的头一个位置。
因为代码是从其他机器上copy过来的,所以这台机器上的模块版本和以前的机器上的不一样,所以导致了这个问题。

我本人并没有找出根本原因,但是发现了他用了自己定义的perl模块的lib。 我的解决办法是在报错的模块前面加上use lib语句,比如:
use lib "/usr/local/lib/perl5/site_perl/5.12.2/sun4-solaris";
use Digest::MD5
use lib "/private lib directory";
use private mudule;

有些private modules 是他自己写的,在private directory里面。

后来得高人指点,发现了他用的perl是cp过来的,这样做是有问题的。所以解决办法很简单,更改第一行到原始的perl安装位置:
#! /usr/local/bin/perl

当然前提是要重新安装报错的模块。

但是我仍然不太理解为什么会一直要求2.36这个旧的版本号? 这个版本号是存储在那个文件里面的? 希望有有人能够解答。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
4 [报告]
发表于 2013-11-01 11:36 |只看该作者
回复 3# hqyus


    一个带C扩展的 Perl 模块通常都是由一个或多个 pm 文件加 .so 组成,use 这个模块时 pm 文件负责加载对应的扩展,这个过程会检测二者的版本号是否一致。所以这个版本号 pm 文件中有,.so 文件中也有,通过它来确认下是否加载了正确的版本

论坛徽章:
0
5 [报告]
发表于 2013-11-04 08:22 |只看该作者
明白了,多谢!  我也猜到可能是存储在.so文件中。 曾经尝试过重新安装旧版本的模块,但是没有安装成功。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
6 [报告]
发表于 2013-11-04 08:56 |只看该作者
回复 5# hqyus


    你这里是 pm 文件和 .so 文件版本不一致导致的,可以打开 $DynaLoader::dl_debug 标志来看下到底加载的哪个来找原因。然后把旧的删除掉再重新安装才OK

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
7 [报告]
发表于 2013-11-04 09:29 |只看该作者
系统的升级可能会让一些设置了版本依存关系的代码变成一堆破烂。

由于惧怕模块的升级版本会更改 API 或函数的行为,依存关系会强制检测版本。

互相不信任导致的损失太大了。

一旦发布模块,保持对以前接口的兼容是每一个有程序员道德的人的要求。

Digest::MD5 模块不知道从 2.36 到 3.53 有没有更改接口名称。如果没有更改,这种版本强制检测就多余了。

如果对于接口没有变化的模块的版本强制检测代码,都进行修复的话,会处理到很多潜在的问题。

对于接口变化的新的模块,不允许使用原来的名称。

我相信这是 Perl CPAN 上发布的大部分模块的基本规则。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
8 [报告]
发表于 2013-11-04 10:32 |只看该作者
回复 7# 104359176


    共享库中实现核心部分,pm 文件提供接口,共享库中的实现再怎么变 pm 文件中只要正确的粘和就行了,所以要求这两个一一对应不过分吧。绝大多数带C扩展的模块都是只用 C 实现 Perl 实在做不了的那部分,再在 pm 文件中包装下提供一个 perlish 的接口。

    楼主这情况应该是把模块的 pm 文件拷贝到 @INC 的一个目录中就以为安装完了,结果系统在对应的目录查找不到 .so 就用了@INC 后面目录中的,版本对不上是自然的。用 cpan 安装模块是不会出这问题的,我也没遇到过

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
9 [报告]
发表于 2013-11-04 10:46 |只看该作者
回复 8# zhlong8


     我遇到过一个人,维护一个服务器的应用,是 Perl 搞的,由于服务器升级,出现了一大堆类似的提示。搞的焦头烂额。也不知道最后搞定没有。

很多老板一听说升级会导致不可用,就放弃了升级计划。导致 Perl 的版本越来越落后,也没有人去维护。直到最后,被彻底丢掉。

论坛徽章:
0
10 [报告]
发表于 2013-11-04 11:31 |只看该作者
"对于接口变化的新的模块,不允许使用原来的名称。"
"Digest::MD5 模块不知道从 2.36 到 2.53 有没有更改接口名称。如果没有更改,这种版本强制检测就多余了。"

非常同意这两句话。
如果接口没有变化,就不应该强制对应版本号。 如果有变化,就不能用旧的模块名。


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP