如何在没有root用户访问权限的情况下在本地安装CPAN模块(DynaLoader.pm第229行错误)?

时间:2020-03-06 14:26:31  来源:igfitidea点击:

不能与其他模块一起使用,仅举一个例子。我使用CPAN设置安装了Text :: CSV_XS:

'makepl_arg' => q[PREFIX=~/lib],

当我尝试运行test.pl脚本时:

$ perl test.pl
#!/usr/bin/perl

use lib "/homes/foobar/lib/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi";

use Text::CSV_XS;

print "test";

我懂了

Can't load '/homes/foobar/lib/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Text/CSV_XS/CSV_XS.so' for module Text::CSV_XS: /homes/foobar/lib/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Text/CSV_XS/CSV_XS.so: cannot open shared object file: No such file or directory at /www/common/perl/lib/5.8.2/i686-linux/DynaLoader.pm line 229.
at test.pl line 6
Compilation failed in require at test.pl line 6.
BEGIN failed--compilation aborted at test.pl line 6.

我将错误追溯到DynaLoader.pm,它发生在以下行:

# Many dynamic extension loading problems will appear to come from
# this section of code: XYZ failed at line 123 of DynaLoader.pm.
# Often these errors are actually occurring in the initialisation
# C code of the extension XS file. Perl reports the error as being
# in this perl code simply because this was the last perl code
# it executed.

my $libref = dl_load_file($file, $module->dl_load_flags) or
    croak("Can't load '$file' for module $module: ".dl_error());

CSV_XS.so存在于以上目录中

解决方案

尝试以下方法:

'makepl_arg' => q[PREFIX=~/]

PREFIX为将要安装到的所有目录(bin,lib等)设置基础。

'〜'也可能会遇到shell扩展问题。我们可以尝试自己扩展它:

'makepl_arg' => q[PREFIX=/home/users/foobar]

如果包含用于获取所询问错误的命令,这也将很有帮助。

问题文件(CSV_XS.so)是否存在?

是否在列出的位置存在?

如果我们这样做:

set |grep PERL

输出是什么?

我们是否成功安装了其他本地perl模块?

在安装模块时,我们是否观看了输出?它在哪里说安装了模块?看在lib中。我们看到期望的下一个目录了吗?

查看〜/ lib以查看传送结束的位置,以验证我们在use lib语句中使用的目录名称正确:

%找到〜/ lib -name CSV_XS.so

一旦看到它的安装位置,就可以在use lib(或者PERL5LIB或者任何其他名称)中使用该目录名称。

我希望我们以某种方式在其中有一个" lib / lib"。 PREFIX只是前缀,安装程序会将其他目录部分添加到该基本路径。其中包括lib,man,bin等。

如果有空间,我强烈建议我们在自己的主目录中安装自己的perl。然后,我们可以控制一切,并设置自己的模块,如果管理员让我们使用的是Perl的较早版本,则可以转义。 (更不用说在升级的某一天保留自己并忽略我们所依赖的所有模块。)

从错误消息(" / www / common ..."处)看来,脚本是CGI或者mod_perl脚本。 Web服务器可能未以用户" foo"的身份运行,我们已经在其主目录下安装了模块,这可能导致Web服务器无法读取该目录。

它也可能在" chroot监狱"中运行,这意味着脚本可能看不到我们安装模块的目录。

换句话说,仅仅因为我们可以看到模块,并不意味着Web服务器以及脚本可以这样做。我们应该检查相关的文件权限,如果服务器是chroot,是否在虚拟文件系统中挂载了模块目录。

我个人建议使用local :: lib。 :)