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

Не работает с другими модулями, но для примера. Я установил 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 существует в указанном выше каталоге

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
1
20 469
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

'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, та же проблема

Tomasz 20.09.2008 01:28

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

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

% find ~/lib -name CSV_XS.so

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

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

то скрипт не может найти CSV_XS.pm, который находится в каталоге вверх

Tomasz 20.09.2008 01:19

Извините, но я не понимаю вашего комментария. Вы нашли, где был установлен модуль, и использовали ли нужный каталог в lib?

brian d foy 23.09.2008 04:27

да, путь правильный с самого начала, но в DynaLoader он не работает

Tomasz 09.10.2008 18:43

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

но тогда сценарий не будет работать ни для кого другого. в любом случае я всегда мог попросить ИТ-поддержку установить его как root, но это не главное

Tomasz 20.09.2008 01:29

local :: lib - намного лучшее решение, чем это

singingfish 25.01.2009 01:16

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

Он также может работать в «chroot jail», что может означать, что каталог, в который вы установили модуль, может быть не виден сценарию.

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

Ответ принят как подходящий

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

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

Chris Quenelle 11.01.2013 23:30

Не могли бы вы объяснить Почему, который вы предложили local::lib? Что это такое и почему лучше других представленных здесь решений?

Stefan Lasiewski 03.01.2014 03:39

И как мы это делаем, когда: Can't locate local/lib.pm in @INC .... (и мы не можем его установить, следовательно, необходимо устанавливать модули под своим домашним каталогом)

Olivier Dulac 18.05.2017 17:06

Другие вопросы по теме