.exe с использованием Par::Packer со скриптом, содержащим Net::SSH2, не работает

Я использую модуль Net::SSH2 в моем скрипте Perl и пытаюсь сделать исполняемый файл (.exe для Windows), используя Par::Packer. Сценарий должен подключиться к Linux-серверу из окна Windows, используя открытые ключи, и не хочет вводить пароль.

Столкнулся с ошибкой ниже при запуске.exe

Не удается загрузить 'C:\Users...\AppData\Local\Temp\par-73656172756d7567616d\cache-a6d57d5a234829aae84d08c4a78a09ad307ea8d3\a9057da2.xs.dll' для модуля Net::SSH2: load_file: указанный модуль не найден в C:/Strawberry/perl/lib/DynaLoader.pm строка 193. в C:/Strawberry/perl/vendor/lib/PAR/Heavy.pm строка 123.

Попытка обойти следующие методы, но ни один из них не сработал

  1. Пытался упаковать с портативной версии Strawberry Perl
  2. Пытался связать a9057da2.xs.dll при упаковке с использованием Par:: Packer

Есть ли обходной путь или исправление для упаковки сценария perl в.exe с Net:SSH2. Или есть альтернативы Net::SSH2 для ssh из windows в Linux, используя открытые ключи (не передавая пароли)?

2 ответа

Если вы получаете что-то вроде:

      Can't load D:\TEMP\par-76696b616d7768\cache-48ca417d0c47dd7f7245a1218d8d6614470afa93\7c34139c.xs.dll' for module XML::LibXML: load_file:The specified module could not be found at <embedded>/DynaLoader.pm line 193.
at <embedded>/PAR/Heavy.pm line 140.
BEGIN failed--compilation aborted at D:\TEMP\par-76696b616d7768\cache-48ca417d0c47dd7f7245a1218d8d6614470afa93\inc\lib/XML/LibXML.pm line 156.
Compilation failed in require at script/test.pl line 3.
BEGIN failed--compilation aborted at script/test.pl line 3.

затем добавьте следующий тестовый код
( проверьте свой путь к Listdlls.exe и при необходимости исправьте приведенное ниже )

      #This is the code causing the issue
use XML::LibXML;
my $x = XML::LibXML->new();

ListPerlDLLs();

sub ListPerlDLLs
{
  my @ret =  `C:\\"Program Files"\\Sysinternals\\Listdlls.exe  $$`; # $$ : current PID

  foreach my $line (@ret)
  {
    $line =~ s/\s$//;
    next if $line !~ /^0x\w+\s+\w+\s+(.+)/;
    my $dll = $1;
    next if $dll =~ /^c:\\windows\\/i;
    print "$dll\n";
  }
}

Listdlls.exe от Microsoft — см. SysInternals \

Во-первых, дважды щелкните Listdlls.exe, чтобы принять заявление об отказе
(при первом запуске запросит подтверждение).

Когда вы запустите сценарий Perl , вы получите что-то вроде этого:

      D:/strawberry-perl/perl/bin/perl.exe
D:/strawberry-perl/perl/bin/perl532.dll
D:/strawberry-perl/perl/bin/libgcc_s_seh-1.dll
D:/strawberry-perl/perl/bin/libwinpthread-1.dll
D:/strawberry-perl/perl/bin/libstdc++-6.dll
D:/strawberry-perl/perl/lib/auto/Encode/Encode.xs.dll
D:/strawberry-perl/perl/lib/auto/Fcntl/Fcntl.xs.dll
D:/strawberry-perl/perl/lib/auto/Storable/Storable.xs.dll
D:/strawberry-perl/perl/lib/auto/Data/Dumper/Dumper.xs.dll
D:/strawberry-perl/perl/lib/auto/IO/IO.xs.dll
D:/strawberry-perl/perl/vendor/lib/auto/XML/LibXML/LibXML.xs.dll
D:/strawberry-perl/c/bin/libxml2-2__.dll
D:/strawberry-perl/c/bin/libiconv-2__.dll
D:/strawberry-perl/c/bin/liblzma-5__.dll
D:/strawberry-perl/c/bin/zlib1__.dll
D:/strawberry-perl/perl/lib/auto/List/Util/Util.xs.dll

если вы соберете свой EXE и запустите его, вы получите что-то вроде:

      D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/test.exe
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/perl532.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/libgcc_s_seh-1.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/libwinpthread-1.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/libstdc++-6.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/5461bd7b.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/1ed3ae5b.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/89b9c18b.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/18f23f26.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/0e796a00.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/5d0ea4ea.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/d3d27bc6.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/d8bcc032.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/64916f0f.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/76c6a0cc.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/6b1ff21f.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/4eceebd6.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/ebaed210.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/831f407e.xs.dll
D:/TEMP/par-76696b616d7768/cache-48ca417d0c47dd7f7245a1218d8d6614470afa93/7c34139c.xs.dll
D:/strawberry-perl/c/bin/libxml2-2__.dll
D:/strawberry-perl/c/bin/liblzma-5__.dll
D:/strawberry-perl/c/bin/zlib1__.dll
D:/strawberry-perl/c/bin/libiconv-2__.dll

Последние четыре — это отсутствующие библиотеки DLL —
добавьте их с помощью--linkпараметры:

      call pp test.pl -o test.exe --link D:/strawberry-perl/c/bin/libxml2-2__.dll --link D:/strawberry-perl/c/bin/liblzma-5__.dll --link D:/strawberry-perl/c/bin/zlib1__.dll --link D:/strawberry-perl/c/bin/libiconv-2__.dll

Вероятно, вы не упаковываете libssh2 а также openssl DLL внутри исполняемого файла.

Par::Packer не обнаруживает зависимости DLL автоматически, вам нужно четко указать, какие из них нужны вашей программе (простой способ определить, какие DLL нужны вашей программе, - это использовать Process Monitor, утилиту, позволяющую отслеживать активность процесса).

Другой вариант - использовать мой модуль Win32:: Packer для упаковки приложения, которое автоматически находит зависимости DLL.

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