Perl:exe化
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に戻る