Не работает с другими модулями, но для примера. Я установил Text :: CSV_XS с настройкой CPAN:
'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 и т. д.).
Вы также можете столкнуться с проблемами расширения оболочки с вашим '~'. Можете попробовать сами расширить:
'makepl_arg' => q[PREFIX=/home/users/foobar]
Также было бы полезно, если бы вы включили команды, которые вы использовали для получения запрашиваемой ошибки.
Соответствующий файл (CSV_XS.so) существует?
Он существует в указанном месте?
Если вы это сделаете:
set |grep PERL
Что на выходе?
Вы успешно установили другие локальные модули Perl?
PERL5LIB = '/ homes / foobar / lib / perl5 / site_perl / 5.8.4 / i686-linux: {HOME} / lib / perl5 / si te_perl / 5.8.4' нет пробовал с Data :: UUID, та же проблема
При установке модуля смотрели вывод? Где сказано, что установлен модуль? Посмотрите в lib. Вы видите следующий ожидаемый каталог?
Посмотрите в ~ / lib, чтобы увидеть, где все закончилось, и убедитесь, что у вас есть правильное имя каталога в вашем операторе use lib:
% find ~/lib -name CSV_XS.so
Как только вы увидите, где он установлен, используйте это имя каталога в вашем use lib (или PERL5LIB или что-то еще).
Я думаю, у вас там как-то есть lib/lib. PREFIX - это просто префикс, и программа установки добавляет другие части каталога к этому базовому пути. Сюда входят lib, man, bin, так далее.
то скрипт не может найти CSV_XS.pm, который находится в каталоге вверх
Извините, но я не понимаю вашего комментария. Вы нашли, где был установлен модуль, и использовали ли нужный каталог в lib?
да, путь правильный с самого начала, но в DynaLoader он не работает
Я настоятельно рекомендую установить ваш собственный Perl в свой домашний каталог, если у вас есть место. Затем вы можете держать все под своим контролем и сохранять свой собственный набор модулей, а также сбегать, если администраторы держат вас на более старой версии perl. (Не говоря уже о том, чтобы сохранить себя, если они когда-нибудь обновятся и оставят все модули, на которые вы полагаетесь.)
но тогда сценарий не будет работать ни для кого другого. в любом случае я всегда мог попросить ИТ-поддержку установить его как root, но это не главное
local :: lib - намного лучшее решение, чем это
Из сообщения об ошибке ("at / www / common ...") видно, что ваш сценарий является сценарием CGI или mod_perl. Веб-сервер, вероятно, не работает от имени пользователя 'foo', в домашний каталог которого вы установили модуль - это может привести к тому, что веб-сервер не сможет прочитать этот каталог.
Он также может работать в «chroot jail», что может означать, что каталог, в который вы установили модуль, может быть не виден сценарию.
Другими словами, то, что ты может видеть модуль, не означает, что веб-сервер и, следовательно, ваш скрипт могут это делать. Вы должны проверить соответствующие права доступа к файлам и, если сервер находится в режиме chrooted, смонтирован ли каталог вашего модуля в виртуальной файловой системе.
Лично я бы посоветовал использовать local :: lib. :)
Было бы очень полезно предоставить здесь несколько коротких команд, которые показывают, как использовать local :: lib для установки модуля в каталог локальной библиотеки.
Не могли бы вы объяснить Почему, который вы предложили local::lib? Что это такое и почему лучше других представленных здесь решений?
И как мы это делаем, когда: Can't locate local/lib.pm in @INC .... (и мы не можем его установить, следовательно, необходимо устанавливать модули под своим домашним каталогом)
возможный дубликат Как я могу использовать новый модуль Perl без разрешений на установку?