8

不适用于其他模块,但举个例子。我使用 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";

我明白了

无法为模块 Text::CSV_XS: /homes/ 加载 '/homes/foobar/lib/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Text/CSV_XS/CSV_XS.so' foob​​ar/lib/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Text/CSV_XS/CSV_XS.so:无法打开共享对象文件:/www/common/perl 中没有这样的文件或目录/lib/5.8.2/i686-linux/DynaLoader.pm 第 229 行。
在 test.pl 第 6 行
在 test.pl 第 6 行的 require 编译失败。
BEGIN failed——编译在 test.pl 第 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 存在于上述目录中

4

6 回答 6

5

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

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

% find ~/lib -name CSV_XS.so

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

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

于 2008-09-19T17:41:23.990 回答
3

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

于 2009-01-23T01:28:44.040 回答
2

试试这个:

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

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

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

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

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

于 2008-09-19T15:39:48.730 回答
1

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

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

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

于 2008-11-07T23:17:33.287 回答
0

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

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

如果你这样做:

set |grep PERL

输出是什么?

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

于 2008-09-19T16:32:46.450 回答
0

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

于 2008-09-19T20:41:08.147 回答