Ubuntu升级后Perl模块与cpan报错:库与二进制文件不匹配
我之前碰到过一模一样的情况,这个loadable library and Perl binaries are mismatched错误的核心原因很明确:你的普通用户目录下残留了旧Perl(5.22.1)编译的二进制模块文件,这些模块是针对旧版本Perl编译的,和升级后系统自带的Perl 5.26.1完全不兼容。而root用户正常,是因为root从来没在自己目录下装过自定义Perl模块,完全用的是系统全局的兼容版本。
下面是一步步的修复步骤,亲测有效:
第一步:彻底清理普通用户的本地Perl残留
先找出你的Perl查找模块的所有路径,运行:
perl -e 'print join("\n", @INC)'输出里重点看以你的用户目录开头的路径(比如
/home/xxx/perl5、~/.cpan、~/.local/share/perl这类),这些就是旧模块的藏身之处。直接删除这些用户本地的Perl相关目录(执行前可以先
ls确认一下目录存在,避免误删):rm -rf ~/perl5 ~/.cpan ~/.local/share/perl ~/.local/lib/perl5检查你的shell配置文件(比如
~/.bashrc、~/.zshrc),如果之前用过local::lib或者cpanm添加过PERL5LIB、PERL_LOCAL_LIB_ROOT这类环境变量,把相关的配置行删掉,然后重启终端或者执行source ~/.bashrc让修改生效。
第二步:重新初始化CPAN
用普通用户身份运行:
cpan第一次运行会引导你配置CPAN,直接按回车选择默认配置就行,这样会生成适配当前Perl 5.26.1的全新配置和模块存储结构。
如果还是有问题,试试用cpanm重新安装需要的模块:
先安装cpanm(如果没装的话):sudo apt install cpanminus然后用cpanm安装你需要的模块,比如:
cpanm threads Cwd这会重新编译并安装完全适配当前Perl版本的模块。
第三步:验证修复效果
- 运行之前报错的Perl脚本,看是否还出现握手密钥不匹配的错误
- 直接运行
cpan,确认能正常进入CPAN交互界面 - 运行
perl -v确认当前Perl版本是5.26.1,再执行perl -Mthreads -e 'print "threads模块正常工作\n"'验证模块加载正常
额外建议
- 以后尽量优先用Ubuntu官方源的Perl模块包,比如
libthreads-perl、libcwd-perl,用sudo apt install安装,这样系统升级时会自动同步兼容版本,避免手动编译的模块出现版本不兼容问题。 - 如果必须用CPAN安装自定义模块,记得每次系统Perl版本升级后,都清理用户本地的旧模块,重新安装适配新版本的模块。
内容的提问来源于stack exchange,提问作者Pradyumna Sagar

