繁体   English   中英

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

[英]How can I install CPAN modules locally without root access (DynaLoader.pm line 229 error)?

不适用于其他模块,但举个例子。 我使用 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 存在于上述目录中

当您安装模块时,您是否观看了输出? 它在哪里说它安装了模块? .查看。 你看到你期望的下一个目录了吗?

查看 ~/lib 以查看所有内容的最终位置,以验证您的use lib语句中的目录名称是否正确:

% find ~/lib -name CSV_XS.so

一旦您看到它的安装位置,请在您的use lib (或 PERL5LIB 或其他)中使用该目录名称。

我希望你有一个lib/lib不知何故。 PREFIX只是前缀,安装程序会将其他目录部分附加到该基本路径。 .这包括 lib、man、bin

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

试试这个:

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

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

您可能还会遇到“~”的外壳扩展问题。 你可以尝试自己扩展:

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

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

从错误消息(“at /www/common ...”)可以看出您的脚本是 CGI 或 mod_perl 脚本。 Web 服务器可能没有以用户“foo”的身份运行,您在其主目录下安装了模块 - 这可能导致 Web 服务器无法读取该目录。

它也可能在“ chroot jail ”中运行,这意味着您安装模块的目录可能对脚本不可见。

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

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

它是否存在于列出的位置?

如果你这样做:

set |grep PERL

输出是什么?

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

如果您有空间,我强烈建议在您自己的主目录中安装您自己的 perl。 然后你可以控制一切并保留你自己的模块集,如果管理员让你使用旧版本的 perl,也可以逃避。 (更不用说如果他们有一天升级并遗漏您所依赖的所有模块时可以保护自己。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM