Как установить модули CPAN локально без корневого доступа (ошибка DynaLoader.pm line 229)?

Не работает с другими модулями, но для примера. Я установил Text:: CSV_XS с настройкой CPAN:

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

Когда я пытаюсь запустить test.pl script:

$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 существует в приведенном выше каталоге

Ответ 1

Лично я бы предложил использовать local:: lib.:)

Ответ 2

Когда вы установили модуль, вы смотрели выход? Где он сказал, что он установил модуль? Посмотрите lib. Вы видите следующий каталог, который вы ожидаете?

Посмотрите в ~/lib, чтобы узнать, где закончилось eveything, чтобы убедиться, что у вас есть правильное имя каталога в инструкции use lib:

% find ~/lib -name CSV_XS.so

Как только вы увидите, где он установлен, используйте это имя каталога в use lib (или PERL5LIB или что-то еще).

Я ожидаю, что у вас есть lib/lib. PREFIX - это только префикс, ну, а установщик присоединяет другие части каталога к этому базовому пути. Это включает в себя lib, man, bin, и т.д..

Ответ 3

Попробуйте это вместо:

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

PREFIX устанавливает базу для всех каталогов, в которые вы будете устанавливать (bin, lib и т.д.)

Вы также можете столкнуться с проблемами расширения оболочки с помощью "~". Вы можете попытаться расширить его самостоятельно:

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

Было бы полезно, если бы вы включили команды, которые вы использовали для получения ошибки, о которой вы просите.

Ответ 4

Из сообщения об ошибке ( "at/www/common..." ) видно, что ваш script является CGI или mod_perl script. Веб-сервер, вероятно, не работает как пользовательский "foo", под домашним каталогом которого вы установили модуль, что может привести к тому, что веб-сервер не сможет прочитать этот каталог.

Он также может работать в chroot jail", что означает, что каталог, в котором вы установили модуль, может не видны в script.

Другими словами, только потому, что вы можете видеть модуль, это не значит, что веб-сервер и, следовательно, ваш script могут это сделать. Вы должны проверить соответствующие права доступа к файлам, и если сервер chrooted, будет ли ваш каталог модуля смонтирован в виртуальной файловой системе.

Ответ 5

Существует ли файл (CSV_XS.so)?

Он существует в указанном месте?

Если вы выполните:

set |grep PERL

Что такое вывод?

Вы успешно установили другие локальные модули perl?

Ответ 6

Я настоятельно рекомендую установить собственный perl в вашем домашнем каталоге, если у вас есть место. Затем вы можете держать все под вашим контролем и сохранять свой собственный набор модулей, а также избегать, если администраторы держат вас на более старой версии perl. (Не говоря уже о том, чтобы сохранить себя, если они обновятся, и оставьте все модули, на которых вы полагаетесь.)