Почему PAR в Perl не может найти загружаемый объект для Socket.pm? - PullRequest
4 голосов
/ 27 февраля 2009

Я использовал PAR :: Packer для упаковки своего Perl-приложения на Cygwin, а затем запускал его на HPUX.

Хорошо работает простой привет мир, например ::1003 *

pp -p hello.pl

Это приводит к a.par, а затем к HPUX:

parl a.par

Отлично работает.

Однако, если упаковать более крупное приложение с множеством зависимостей с помощью -B bundle switch, не повезло, вместо этого я получаю ошибку:

 Can't locate loadable object for module Socket in @INC

Есть идеи, может быть, проблемы с сетью Windows / Unix? Какие-нибудь исправления?

Ответы [ 4 ]

5 голосов
/ 27 февраля 2009

Это происходит потому, что Socket загружает общую библиотеку, и она не переносима на разные платформы (то есть, общая библиотека Socket в Windows не будет работать в Linux, не будет работать в HPUX).

Вы можете попробовать две вещи:

  1. Определите все места, где вам нужны общие библиотеки, и установите их на вашей целевой платформе. Вам также может понадобиться исключить эти модули из вашего архива PAR.
  2. Переключение на реализации чистого Perl (которые (более) переносимы). Если вы не являетесь знатоком Perl, C и вашей целевой платформы, а версия с чистым Perl еще не доступна, вам может не повезти с этим.
2 голосов
/ 02 марта 2009

Советы по Perl blixtor из комментариев Я перемещаю «редактировать обновления», которые у меня были в вопросе, чтобы ответить на мой собственный вопрос здесь:

Большая часть кредита здесь принадлежит Эндрю Барнетту, 2 ключевых вопроса были

  1. библиотека собственных кодов C
  2. пути Perl LIB

Вот шаги, которые я выполнил, чтобы заставить созданный Cygwin Par работать на HPUX, я считаю, что шаги должны быть примерно одинаковыми на любом Unix:

Следуя совету Эндрю, удалил IO :: Socket с помощью переключателя pp -X IO :: Socket , но затем, запустив получившийся parl в unix, я немного изменил, но все еще связанную ошибку:

Can't locate Socket.pm in @INC (@INC contains: CODE(0x406ab018) CODE(0x4055c880) CODE(0x40563978)) at Net/Config.pm line 11

несмотря на то, что при запуске "perl -MCPAN -e shell" в Unix Socket должен быть установлен и обновлен:

cpan[2]> install IO::Socket
IO::Socket is up to date (1.30_01).

Таким образом, в дополнение к исключению Socket с переключателем -X abobe, мне также пришлось создать сценарий-обертку для HPUX с этой строкой в ​​1, wrapper.pl:

use PAR { file => 'bdiff.par', run => 'bdiff.pl' };

затем, чтобы запустить это, я не использовал parl, вместо этого я просто вызвал бы его с помощью perl, и мне пришлось предоставить полные пути к путям lib по умолчанию с помощью ключа -I, например:

perl -I/lib/perl5/lib/5.10.0/PA-RISC2.0 -I/lib/lib/site_perl wrapper.pl allparameters

по какой-то причине при использовании parl кажется, что пути lib по умолчанию исключаются, поэтому полные пути указаны выше.

2 голосов
/ 27 февраля 2009

Преимущество установки фактического perl на вашем HPUX заключается в том, что ваше приложение cygwin может затем запускаться на hpux perl. Пакеты PAR обычно не работают между любыми двумя платформами. На мой взгляд, это ничем не отличается от создания hello.exe на Cygwin и его запуска на HPUX.

0 голосов
/ 14 августа 2011

FWIW, PAR не предназначен для переноса на разные платформы - не ожидайте, что пакет par, созданный на cygwin, будет работать на linux / hpux ....

...