XS.c:可加载库和 Perl 二进制文件不匹配(获得握手密钥 0xce00080,需要 0xdb80080)

Man*_*ish 4 perl

我正在使用 perl5 并执行我的脚本

perl myscript.R 
Run Code Online (Sandbox Code Playgroud)

并出现以下错误。

Can't locate local/lib.pm in @INC (you may need to install the local::lib module) (@INC contains: /kb/deployment/lib /kb/deployment/lib/perl5 /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.24.1 /usr/local/share/perl/5.24.1 /usr/lib/x86_64-linux-gnu/perl5/5.24 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.24 /usr/share/perl/5.24 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base).
BEGIN failed--compilation aborted.
Run Code Online (Sandbox Code Playgroud)

所以我使用以下命令安装了 local::lib

cpan local::lib
Run Code Online (Sandbox Code Playgroud)

但在我尝试使用 perl myscript.pl 并得到

  XS.c: loadable library and perl binaries are mismatched (got handshake key 0xce00080, needed 0xdb80080)
Run Code Online (Sandbox Code Playgroud)

我对解决这个问题一无所知。

ike*_*ami 10

您尝试加载的模块的二进制组件的版本和 Perl 组件的版本不匹配。

您似乎已使用 local::lib 在您的主目录中安装模块。升级您的perl系统会导致此设置严重失败。解决方案是删除~/perl5[1]并重新安装您本地安装的模块。


如果您有多个 Perl 版本,或者您不想在下次升级 Perl 时出现此问题,该怎么办?

有多种方法可以告诉安装程序在您的主目录中安装模块,以便 Perl 的多个版本可以共享安装目录,[2]但它实际上不起作用。[3]

这就是为什么我习惯perlbrew将 Perl 本身安装在我的主目录中,这样我就不必覆盖模块的安装位置。使用perlbrew有以下好处:

  • 您可以毫无麻烦地安装多个 Perl 版本。
  • 您可以根据需要升级 Perl,而与操作系统更新无关。
  • 在切换到“永久”使用 Perl 之前,您可以使用较新版本的 Perl 测试脚本和模块。
  • 您可以使用旧版本的 Perl 测试脚本和模块。

  1. 好吧,重命名它,直到您确定已经完成为止。
  2. 通过将PREFIX/--prefixLIB/--lib选项传递给Makefile.PL/Build.PL而不是INSTALL_BASE/ --install-base
  3. 当纯 Perl 模块依赖于 XS 模块时,就会遇到问题。