DynaLoader видит неправильные значения в @INC - PullRequest
3 голосов
/ 05 июня 2010

У меня установлено несколько версий Perl; каждый в другом каталоге. например C:\Perl\5.x.y. Я переключаюсь между ними в оболочке, устанавливая PERL5LIB и изменяя свой PATH так, чтобы за раз видна только одна версия. Обычно это работает нормально, но при попытке запустить версию pp (PAR :: Packer), установленную под 5.10.1, у меня возникают проблемы с загрузкой компонентов XS. parll2nc.exe жалуется:

Это приложение не удалось запустить, поскольку perl512.dll не был найден ...

Я установил PERL_DL_DEBUG и вижу следующее при инициализации DynaLoader:

DynaLoader.pm loaded (C:/Perl/5.10.1/site/lib C:/Perl/5.12.1/lib ., \lib)

Вещество перед запятой @INC. Первая запись правильная, вторая , а не . Я не могу понять, как DynaLoader получает путь к 5.12 lib, так как запуск perl напрямую показывает то, что я ожидал:

C:\>perl -e "print join ' ', @INC"
C:/Perl/5.10.1/site/lib C:/Perl/5.10.1/lib .

Как DynaLoader выбирает неверный путь и как мне предотвратить это?

Ответы [ 2 ]

4 голосов
/ 05 июня 2010

Аналогично подходу, который я предложил для этого вопроса , поместите трассировку в @INC и посмотрите, когда она обновится.

В самом верху вашего скрипта, перед любыми другими use утверждениями, поставьте:

use Tie::Trace;
BEGIN { Tie::Trace::watch @INC };

Тогда вы получите предупреждение, когда другой модуль отредактирует ваш массив @INC.

3 голосов
/ 05 июня 2010

Я понял это. Проблема вызвана взаимодействием нескольких вещей:

  • У меня есть * .pl файлы, связанные с perl.exe (для последней установленной версии Perl - 5.12.1).
  • В моей переменной окружения PATHEXT есть «.PL», чтобы я мог запускать сценарии Perl без ввода расширения. например C:\>foo вместо C:\>foo.pl
  • У моей установки утилиты pp нет оболочки для пакетного файла, созданной с помощью pl2bat. (Я не уверен почему.)

Конечным результатом является то, что когда я запустил pp @myconfig, он фактически сделал это:

C:\Perl\5.12.1\bin\perl.exe C:\Perl\5.10.1\site\bin\pp.pl @myconfig

т.е. он запустил версию pp.pl по моему пути, используя версию perl, связанную с файлами * .pl, not версию perl в моем PATH. Таким образом, смесь библиотек в @INC между тем, что получено из исполняемого файла (C: \ Perl \ 5.12.1 \ lib), и тем, что получено из переменной среды PERL5LIB (C: \ Perl \ 5.10.1 \ site \ lib).

Решение состоит в том, чтобы либо запустить pp как perl pp.pl, либо (лучше, потому что вам не нужно ничего запоминать), чтобы создать пакетную оболочку. Предполагая, что .BAT находится в PATHEXT до .PL, когда вы наберете pp, Windows будет запускать pp.bat вместо pp.pl, а pp.bat вызывает perl (используя версию в вашем пути).

вздыхает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...