Perl:exe化

提供:yonewiki

Perlに戻る 

exe化

Perlで作成したプログラムをexe化することにより、ActivePerlがインストールされていないWindowsPCでも
作成したプログラムが実行できるようになります。

ActivePerl Version5.12.8以降をインストールした環境の場合、
コマンドプロンプトでexe化するモジュールをインストールすることで、
exe化に必要な環境が整備できます。

CPAN -fi PAR::Packer

を実行するとモジュールのインストールが始まります。高速通信環境でも
ダウンロード処理に10分くらいかかかります。


と、できると思ったのですが、Windows7 64bit版では動作しませんでした。

いろいろ調べましたが、2013年06月09日時点ではまだ、わかっていません。海外でも相当な話題になっているようなので、
なんか回避策はあるやもしれませんが…
32bit版 ActivePerlにした方がよかったかも、32bit版ならできてる人がいるみたいだし。
ActivePerlの再インストールからだな。やる気にならないっす。あんまり使わないし…。
けど、最近はPerlというと、こういう使い方が主だったので、ちょい寂しいです。

なんか時間かかりそうなので、この記事はしばらく、このまま停止ですね。
あぁまた時間の浪費をしそうな案件が。

世の中、簡単じゃないってことですね。
いや、先人が築き上げたPerlもActivePerlもKOMODO IDEもPARも凄いってことなんですね。
自分では作れないし。


http://asciiville.com/musings/par-packer-for-strawberry-perl-516

このあたりが回答編なのかもしれないです。

あとでよく理解しておきましょうかね。

→結局、簡単には出来ないですね。あと、もしできたとしてもPAR::Packerってのは、
Perlを動かすための.dllを内包するだけなので、ファイルサイズがやや大きくなります。
Perl2exeっていうのもあるんですけど、有償だし、使い方大変だし、ってことで、
Perlのexe化はやめましょう。時間の無駄です。
Perlがインストールされているマシンで動かすのを前提とした言語だと割り切って使うのが、
よろしいかと思います。

exe化が必要な場合には、Microsoftが作ってくれたVisual C++とか、そういったたぐいのツールや
Exlipseを使うのがいいと思います。Windowsアプリ開発には先人の築き上げたコンパイラがいかに
便利なのかということを理解した方がよさそうです。

自分で開拓していくのが楽しい人は、ひきつづきPerlでのexe化やってみて下さい。

PAR::Packerのインストール
Perl2exe
ってのがキーワードになります。

PARに関する記事を書こうと思いましたがWindows7 64bit + ActivePerlでは現段階では使えないということにしておきましょう。
cpanからインストールしようとした場合にはPAR.exeが暴走し、正常にインストールできません。
MakeMaker.pmの動作でもkernel32が見つからないというようなエラーも出ます。
海外の方も同様です。もう少し時間がたってからやってみましょう。誰かが対応してくれるかもしれません。他力本願

StrawberyPerl という Perl環境ではうまく行くっぽいですね。

以下エラーでまくりのcpan インストールログです。

$c:\>cpan
…

cpan> install PAR::Packer
Fetching with LWP:
http://ppm.activestate.com/CPAN/authors/01mailrc.txt.gz
Reading 'C:\Perl64\cpan\sources\authors\01mailrc.txt.gz'
............................................................................DONE

Fetching with LWP:
http://ppm.activestate.com/CPAN/modules/02packages.details.txt.gz
Reading 'C:\Perl64\cpan\sources\modules\02packages.details.txt.gz'
  Database was generated on Mon, 10 Jun 2013 10:07:37 GMT
..............
  New CPAN.pm version (v2.00) available.
  [Currently running version is v1.9800]
  You might want to try
    install CPAN
    reload cpan
  to both upgrade CPAN.pm and run the new version without leaving
  the current session.


..............................................................DONE
Fetching with LWP:
http://ppm.activestate.com/CPAN/modules/03modlist.data.gz
Reading 'C:\Perl64\cpan\sources\modules\03modlist.data.gz'
............................................................................DONE

Writing C:\Perl64\cpan\Metadata
Running install for module 'PAR::Packer'
Running make for R/RS/RSCHUPP/PAR-Packer-1.014.tar.gz
Fetching with LWP:
http://ppm.activestate.com/CPAN/authors/id/R/RS/RSCHUPP/PAR-Packer-1.014.tar.gz
Fetching with LWP:
http://ppm.activestate.com/CPAN/authors/id/R/RS/RSCHUPP/CHECKSUMS
Checksum for C:\Perl64\cpan\sources\authors\id\R\RS\RSCHUPP\PAR-Packer-1.014.tar
.gz ok
Scanning cache C:\Perl64/cpan/build for sizes
DONE
PAR-Packer-1.014/
PAR-Packer-1.014/myldr/
PAR-Packer-1.014/myldr/run_with_inc.pl
PAR-Packer-1.014/myldr/encode_append.pl
PAR-Packer-1.014/myldr/Dynamic.in
PAR-Packer-1.014/myldr/sha1.c.PL
PAR-Packer-1.014/myldr/boot.c
PAR-Packer-1.014/myldr/winres/
PAR-Packer-1.014/myldr/winres/pp.ico
PAR-Packer-1.014/myldr/winres/pp.rc
PAR-Packer-1.014/myldr/winres/pp.manifest
PAR-Packer-1.014/myldr/Makefile.PL
PAR-Packer-1.014/myldr/env.c
PAR-Packer-1.014/myldr/internals.c
PAR-Packer-1.014/myldr/main.c
PAR-Packer-1.014/myldr/file2c.pl
PAR-Packer-1.014/myldr/usernamefrompwuid.c
PAR-Packer-1.014/myldr/par_pl2c.pl
PAR-Packer-1.014/myldr/mktmpdir.h
PAR-Packer-1.014/myldr/utils.c
PAR-Packer-1.014/myldr/mktmpdir.c
PAR-Packer-1.014/myldr/Static.in
PAR-Packer-1.014/MANIFEST.SKIP
PAR-Packer-1.014/contrib/
PAR-Packer-1.014/contrib/stdio/
PAR-Packer-1.014/contrib/stdio/Stdio_readme.txt
PAR-Packer-1.014/contrib/stdio/Stdio.pm
PAR-Packer-1.014/contrib/gui_pp/
PAR-Packer-1.014/contrib/gui_pp/gpp_readme.txt
PAR-Packer-1.014/contrib/gui_pp/gpp
PAR-Packer-1.014/contrib/pare/
PAR-Packer-1.014/contrib/pare/pare_readme.txt
PAR-Packer-1.014/contrib/pare/pare
PAR-Packer-1.014/contrib/procedural_pp/
PAR-Packer-1.014/contrib/procedural_pp/pp_old
PAR-Packer-1.014/contrib/automated_pp_test/
PAR-Packer-1.014/contrib/automated_pp_test/automated_pp_test.pl
PAR-Packer-1.014/contrib/automated_pp_test/hello_tk.pl
PAR-Packer-1.014/contrib/automated_pp_test/hi.ico
PAR-Packer-1.014/contrib/automated_pp_test/pipe_a_command.pm
PAR-Packer-1.014/contrib/automated_pp_test/prior_to_test.pm
PAR-Packer-1.014/contrib/automated_pp_test/remove_file_and_try_executable_again.
pm
PAR-Packer-1.014/contrib/automated_pp_test/test_in_further_subdir.pm
PAR-Packer-1.014/contrib/extract_embedded/
PAR-Packer-1.014/contrib/extract_embedded/extract-embedded.pl
PAR-Packer-1.014/contrib/docs/
PAR-Packer-1.014/contrib/docs/where_is_it.txt
PAR-Packer-1.014/contrib/docs/who_am_i.txt
PAR-Packer-1.014/inc/
PAR-Packer-1.014/inc/Module/
PAR-Packer-1.014/inc/Module/Install.pm
PAR-Packer-1.014/inc/Module/Install/
PAR-Packer-1.014/inc/Module/Install/Win32.pm
PAR-Packer-1.014/inc/Module/Install/Makefile.pm
PAR-Packer-1.014/inc/Module/Install/WriteAll.pm
PAR-Packer-1.014/inc/Module/Install/PAR.pm
PAR-Packer-1.014/inc/Module/Install/Fetch.pm
PAR-Packer-1.014/inc/Module/Install/Include.pm
PAR-Packer-1.014/inc/Module/Install/Metadata.pm
PAR-Packer-1.014/inc/Module/Install/Can.pm
PAR-Packer-1.014/inc/Module/Install/Base.pm
PAR-Packer-1.014/script/
PAR-Packer-1.014/script/pp
PAR-Packer-1.014/script/par.pl
PAR-Packer-1.014/script/tkpp
PAR-Packer-1.014/script/parl.pod
PAR-Packer-1.014/t/
PAR-Packer-1.014/t/20-pp.t
PAR-Packer-1.014/t/30-current_exec.t
PAR-Packer-1.014/t/00-pod.t
PAR-Packer-1.014/t/test-proc
PAR-Packer-1.014/t/40-packer_cd_option.t
PAR-Packer-1.014/t/90-rt59710.t
PAR-Packer-1.014/t/10-parl-generation.t
PAR-Packer-1.014/Makefile.PL
PAR-Packer-1.014/package/
PAR-Packer-1.014/package/parl.nsi
PAR-Packer-1.014/META.json
PAR-Packer-1.014/ChangeLog
PAR-Packer-1.014/lib/
PAR-Packer-1.014/lib/PAR/
PAR-Packer-1.014/lib/PAR/Packer.pm
PAR-Packer-1.014/lib/PAR/StrippedPARL/
PAR-Packer-1.014/lib/PAR/StrippedPARL/Base.pm
PAR-Packer-1.014/lib/PAR/Filter/
PAR-Packer-1.014/lib/PAR/Filter/PodStrip.pm
PAR-Packer-1.014/lib/PAR/Filter/Bleach.pm
PAR-Packer-1.014/lib/PAR/Filter/PatchContent.pm
PAR-Packer-1.014/lib/PAR/Filter/Bytecode.pm
PAR-Packer-1.014/lib/PAR/Filter/Obfuscate.pm
PAR-Packer-1.014/lib/PAR/Filter.pm
PAR-Packer-1.014/lib/pp.pm
PAR-Packer-1.014/lib/App/
PAR-Packer-1.014/lib/App/Packer/
PAR-Packer-1.014/lib/App/Packer/PAR.pm
PAR-Packer-1.014/TODO
PAR-Packer-1.014/MANIFEST
PAR-Packer-1.014/README
PAR-Packer-1.014/AUTHORS
PAR-Packer-1.014/META.yml

  CPAN.pm: Building R/RS/RSCHUPP/PAR-Packer-1.014.tar.gz

Set up gcc environment - gcc.exe (rubenvb-4.5.4) 4.5.4
Checking if your kit is complete...
Looks good
Prototype mismatch: sub main::prompt: none vs ($;$) at C:/Perl64/lib/ExtUtils/Ma
keMaker.pm line 219.
Note (probably harmless): No library found for -lkernel32
Note (probably harmless): No library found for -luser32
Note (probably harmless): No library found for -lgdi32
Note (probably harmless): No library found for -lwinspool
Note (probably harmless): No library found for -lcomdlg32
Note (probably harmless): No library found for -ladvapi32
Note (probably harmless): No library found for -lshell32
Note (probably harmless): No library found for -lole32
Note (probably harmless): No library found for -loleaut32
Note (probably harmless): No library found for -lnetapi32
Note (probably harmless): No library found for -luuid
Note (probably harmless): No library found for -lws2_32
Note (probably harmless): No library found for -lmpr
Note (probably harmless): No library found for -lwinmm
Note (probably harmless): No library found for -lversion
Note (probably harmless): No library found for -lodbc32
Note (probably harmless): No library found for -lodbccp32
Note (probably harmless): No library found for -lcomctl32
Note (probably harmless): No library found for -lmsvcrt
Writing Makefile for par.exe
Writing MYMETA.yml and MYMETA.json
Writing Makefile for PAR::Packer
Writing MYMETA.yml and MYMETA.json
Set up gcc environment - gcc.exe (rubenvb-4.5.4) 4.5.4
cp lib/App/Packer/PAR.pm blib\lib\App\Packer\PAR.pm
cp lib/PAR/Packer.pm blib\lib\PAR\Packer.pm
cp lib/PAR/Filter/Obfuscate.pm blib\lib\PAR\Filter\Obfuscate.pm
cp lib/PAR/Filter/PodStrip.pm blib\lib\PAR\Filter\PodStrip.pm
cp lib/PAR/StrippedPARL/Base.pm blib\lib\PAR\StrippedPARL\Base.pm
cp lib/PAR/Filter.pm blib\lib\PAR\Filter.pm
cp lib/PAR/Filter/PatchContent.pm blib\lib\PAR\Filter\PatchContent.pm
cp lib/PAR/Filter/Bytecode.pm blib\lib\PAR\Filter\Bytecode.pm
cp lib/pp.pm blib\lib\pp.pm
cp lib/PAR/Filter/Bleach.pm blib\lib\PAR\Filter\Bleach.pm
C:\Perl64\bin\perl.exe par_pl2c.pl my_par_pl < ..\script\par.pl > my_par_pl.c
C:\Perl64\bin\perl.exe sha1.c.PL
C:\Perl64\site\bin\gcc.exe -c -DNDEBUG -DWIN32 -D_CONSOLE -DNO_STRICT -DWIN64 -D
CONSERVATIVE -DPERL_TEXTMODE_SCRIPTS -DUSE_SITECUSTOMIZE -DPERL_IMPLICIT_CONTEXT
 -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DHASATTRIBUTE -fno-strict-aliasing -mms-bitfi
elds  -I"C:\Perl64\lib\CORE"  -DPARL_EXE=\"parl.exe\" -O2 main.c
main.c: In function 'main':
main.c:121:23: warning: assignment discards qualifiers from pointer target type
rem
windres -i winres\pp.rc -o ppresource.coff --input-format=rc --output-format=cof
f --target=pe-x86-64
C:\Perl64\site\bin\g++.exe main.o ppresource.coff -s   -L"C:\Perl64\lib\CORE"  C
:\Perl64\lib\CORE\perl516.lib -o par.exe
rem
C:\Perl64\bin\perl.exe encode_append.pl Dynamic.in par.exe Dynamic.pm
C:\Perl64\bin\perl.exe file2c.pl -c 30000 par.exe C:\Perl64\bin\perl516.dll > bo
ot_embedded_files.c
C:\Perl64\site\bin\gcc.exe -c -DNDEBUG -DWIN32 -D_CONSOLE -DNO_STRICT -DWIN64 -D
CONSERVATIVE -DPERL_TEXTMODE_SCRIPTS -DUSE_SITECUSTOMIZE -DPERL_IMPLICIT_CONTEXT
 -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DHASATTRIBUTE -fno-strict-aliasing -mms-bitfi
elds  -I"C:\Perl64\lib\CORE"  -DPARL_EXE=\"parl.exe\" -O2 boot.c
In file included from mktmpdir.h:85:0,
                 from mktmpdir.c:1,
                 from boot.c:10:
sha1.c: In function 'sha_transform':
sha1.c:146:2: warning: right shift count >= width of type
boot.c: In function 'main':
boot.c:204:5: warning: passing argument 3 of 'spawnvpe' from incompatible pointe
r type
c:\perl64\site\lib\auto\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.5.4/../../../.
./x86_64-w64-mingw32/include/process.h:178:20: note: expected 'char * const*' bu
t argument is of type 'const char * const*'
boot.c:204:5: warning: passing argument 4 of 'spawnvpe' from incompatible pointe
r type
c:\perl64\site\lib\auto\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.5.4/../../../.
./x86_64-w64-mingw32/include/process.h:178:20: note: expected 'char * const*' bu
t argument is of type 'const char * const*'
C:\Perl64\site\bin\g++.exe boot.o -static-libgcc -s   -L"C:\Perl64\lib\CORE"  C:
\Perl64\lib\CORE\perl516.lib  ppresource.coff -o boot.exe
rem
C:\Perl64\bin\perl.exe encode_append.pl Static.in boot.exe Static.pm
cp Static.pm ..\blib\lib\PAR\StrippedPARL\Static.pm
cp Dynamic.pm ..\blib\lib\PAR\StrippedPARL\Dynamic.pm
C:\Perl64\bin\perl.exe -Mblib run_with_inc.pl par.exe -q -B -Oparldyn.exe
system(par.exe -IC:\Perl64\cpan\build\PAR-Packer-1.014-qQsNUC\blib\arch -IC:\Per
l64\cpan\build\PAR-Packer-1.014-qQsNUC\blib\lib -IC:/Perl64/site/lib -IC:/Perl64
/lib -I. -q -B -Oparldyn.exe) failed:
dmake.exe:  Error code 255, while making 'parldyn.exe'
dmake.exe:  Error code 255, while making 'subdirs'
  RSCHUPP/PAR-Packer-1.014.tar.gz
  C:\Perl64\site\bin\dmake.exe -- NOT OK
Running make test
  Can't test without successful make
Running make install
  Make had returned bad status, install seems impossible
Failed during this command:
 RSCHUPP/PAR-Packer-1.014.tar.gz              : make NO


cpan> look PAR::Packer
Running look for module 'PAR::Packer'

Trying to open a subshell in the build directory...
Working directory is C:\Perl64\cpan\build\PAR-Packer-1.014-qQsNUC
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Perl64\cpan\build\PAR-Packer-1.014-qQsNUC>cd myldr

C:\Perl64\cpan\build\PAR-Packer-1.014-qQsNUC\myldr>windres -F pe-x86-64 -o ppres
ource.coff winres\pp.rc

C:\Perl64\cpan\build\PAR-Packer-1.014-qQsNUC\myldr>cd ..

C:\Perl64\cpan\build\PAR-Packer-1.014-qQsNUC>dmake -f Makefile install
Set up gcc environment - gcc.exe (rubenvb-4.5.4) 4.5.4
C:\Perl64\site\bin\g++.exe main.o ppresource.coff -s   -L"C:\Perl64\lib\CORE"  C
:\Perl64\lib\CORE\perl516.lib -o par.exe
rem
C:\Perl64\bin\perl.exe encode_append.pl Dynamic.in par.exe Dynamic.pm
C:\Perl64\bin\perl.exe file2c.pl -c 30000 par.exe C:\Perl64\bin\perl516.dll > bo
ot_embedded_files.c
C:\Perl64\site\bin\gcc.exe -c -DNDEBUG -DWIN32 -D_CONSOLE -DNO_STRICT -DWIN64 -D
CONSERVATIVE -DPERL_TEXTMODE_SCRIPTS -DUSE_SITECUSTOMIZE -DPERL_IMPLICIT_CONTEXT
 -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DHASATTRIBUTE -fno-strict-aliasing -mms-bitfi
elds  -I"C:\Perl64\lib\CORE"  -DPARL_EXE=\"parl.exe\" -O2 boot.c
In file included from mktmpdir.h:85:0,
                 from mktmpdir.c:1,
                 from boot.c:10:
sha1.c: In function 'sha_transform':
sha1.c:146:2: warning: right shift count >= width of type
boot.c: In function 'main':
boot.c:204:5: warning: passing argument 3 of 'spawnvpe' from incompatible pointe
r type
c:\perl64\site\lib\auto\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.5.4/../../../.
./x86_64-w64-mingw32/include/process.h:178:20: note: expected 'char * const*' bu
t argument is of type 'const char * const*'
boot.c:204:5: warning: passing argument 4 of 'spawnvpe' from incompatible pointe
r type
c:\perl64\site\lib\auto\mingw\bin\../lib/gcc/x86_64-w64-mingw32/4.5.4/../../../.
./x86_64-w64-mingw32/include/process.h:178:20: note: expected 'char * const*' bu
t argument is of type 'const char * const*'
C:\Perl64\site\bin\g++.exe boot.o -static-libgcc -s   -L"C:\Perl64\lib\CORE"  C:
\Perl64\lib\CORE\perl516.lib  ppresource.coff -o boot.exe
rem
C:\Perl64\bin\perl.exe encode_append.pl Static.in boot.exe Static.pm
cp Static.pm ..\blib\lib\PAR\StrippedPARL\Static.pm
cp Dynamic.pm ..\blib\lib\PAR\StrippedPARL\Dynamic.pm
C:\Perl64\bin\perl.exe -Mblib run_with_inc.pl par.exe -q -B -Oparldyn.exe
system(par.exe -IC:\Perl64\cpan\build\PAR-Packer-1.014-qQsNUC\blib\arch -IC:\Per
l64\cpan\build\PAR-Packer-1.014-qQsNUC\blib\lib -IC:/Perl64/site/lib -IC:/Perl64
/lib -I. -q -B -Oparldyn.exe) failed:
dmake.exe:  Error code 255, while making 'parldyn.exe'
dmake.exe:  Error code 255, while making 'subdirs'

実際にexe化する場合には コマンドプロンプトで

pp (オプション) ****.exe ****.pl

のようなコマンドを実行することで、exe化がされます。 オプションには…

Perlに戻る