2026/03/12(木)Strawberry PerlでImage::Magick, DBD::Pg, DBD::mysqlをEXE化

最新のStrawberry Perl 5.42で、PerlMagickを含むWindows用EXEを生成する方法。

Strawberry Perlのインストール

Strawberry Perlのサイトから、ダウンロードしました。現時点で最新は「5.42.0.1」。形式はどれでも構わないと思いますが、個人的にPortableを選びました。

以下 c:\strawberry-perl-5.42.0.1 にインストールしたものとして話を進めます。

Image::Magickのインストール

ppmからはインストールできません。以下インストール手順です。

ImageMagick(アプリ)のインストール

ImageMagcik公式サイトからDLL版をインストールします。static版ではImage::Magickが利用できません。

  • ImageMagick-7.1.2-15-Q16-HDRI-x64-dll.exe
  • ImageMagick-7.1.2-15-Q8-x64-dll.exe

何でも良いですが、個人的に下を選択しました。インストール時に以下のダイアログで、一番上と「C/C++ヘッダをインストール」をチェックしてください。

install_image_magick_dll.png

一番下はチェックしても成功しましせん。*1

Image::Magick(Perlモジュール)のインストール

metacpanなどからImage::Magick(Image-Magick-7.1.2-3.tar.gz等)をダウンロードし、任意のフォルダに展開します。

Makefile.PLを開き、以下の行を修正します。*2

   # C compiler
   #'CC' => 'gcc -std=gnu99 -std=gnu99',
   'CC' => 'g++',

続いて、Strawberry Perlを実行し、Image::Magickを展開したフォルダに移動します。ここで、Image::Magickをビルドしてインストールします。

perl Makefile.PL
gmake
gmake test
gmake install

アプリのImageMagickに PATH が通ってないと、最初の「perl Makefile.PL」に失敗するので注意してください。

※参考資料: How to install Image::Magick to Strawberry Perl on Windows-10?

Image::Magickパッケージ化の準備

このままだと、ImageMagick(アプリ)が入っていない環境ではうまく動作しません。対策として、ImageMagick側のライブラリを丸ごと Perl の中にコピーしておきます。

ImageMagick-7.x.x内の以下のファイルを、c:\strawberry-perl-5.42.0.1\perl\site\lib\auto\Image\Magick(Magick.xs.dllがある場所)にコピーします。

  • modules をディレクトリごと
  • .xml ファイルすべて
  • .dll ファイルすべて

*1 : 軽く調べた感じ、StrawbeeryPerl 5.32を通常版でインストールしてパスを通してあれば成功するかもしれませんが、試してません。

*2 : この修正が必要なため、cpanコマンドからはうまくインストールできません。

CPANの初期設定

コンパイル済パッケージをインストールできるppmが廃止されたようなので、cpanコマンドを使用して、欲しいものはソースからインストールします。

cpanをまず最初に初期設定します。

cpan
cpan> o conf init pushy_https

パッケージインストール。

cpan PACKAGE::NAME

テストなしでインストール。

cpan -T PACKAGE::NAME

DBD::mysqlのインストール

MySQL用クラアイントライブラリの用意が大変なので、MariaDB用クライアントライブラリを使用して、DBD::mysqlを構築します。

  1. MariaDBのクライアント用ライブラリが必要なためMinGW用パッケージをダウンロードして解凍。bin/ lib/ などの4フォルダを、strawberry-perl-5.xx\c 以下に、上書きコピーします。
  2. DBD::mysql v4.051をダウンロードします。*3
  3. ファイルを展開し、Strawberry Perl上で、そのフォルダに移動します。
  4. ビルドしてインストール。
    c:\>perl Makefile.PL --cflags=-IC:\strawberry-perl-5.42.0.1\c\include\mysql
    c:\>gmake
    c:\>gmake install
    

同じ方法で「DBD::MariaDB v1.22*4もインストールできます。ただ DBD::MariaDB は、入出力時のutf8フラグが強制onになっている(オフにできない)ために、プログラムによっては文字化けに苦しむことになります。

*3 : v5系を構築するには、libmysqlcleint が必要になり面倒です

*4 : v1.23, v1.24はmakeに失敗します(参考情報)。ハマって大変でした……

ライブラリごとEXE化

例えばこんな感じで、パッケージ化可能てす。

pp -M Image::Magick -o test.exe test.pl

実行ファイル(.pl)にて、use しているものはオプション指定をしなくても自動的にパッケージングされます。動的に使用しているモジュールについては -M オプションが必要です。

Perlのモジュールの中には、外部dllを必要とするものがあります。C:\strawberry-perl-5.42.0.1\c\bin に必要なdllは配置されていますが、外部DLLファイルは明示的に指定しない限り、パッケージに含まれません

例えば、Net::SSLeayモジュールを使用する場合は、以下のようになります。

pp -M Net::SSLeay -l libcrypto-3-x64__.dll -l libssl-3-x64__.dll -l zlib1__.dll -o test.exe test.pl

こうして書き出すとオプションが長くなり入力が面倒なので、pp.opt というファイルを用意してその中にオプションを書いておきます。adiaryでの使用例なども参考に。

pp @pp.opt

必要dll一覧

Strawberry Perl 5.42.0.1の場合。

  • Net::SSLeay
    • libcrypto-3-x64__.dll, libssl-3-x64__.dll, zlib1__.dll
  • DBD::Pg
    • libpq__.dll, libcrypto-3-x64__.dll, libssl-3-x64__.dll, zlib1__.dll
  • DBD::mysql(※libmariadbをソースからインストール時*5
    • libmariadb.dll

-aオプション

  • a オプションを指定すると、特定のディレクトリを丸ごと収めることがきます。例えば、
    -a "C:/strawberry-perl-5.26.2.1/perl/site/lib/Image;site/lib/auto/Image"
    

とすることで、ppm を使って導入した Image::Magick の.dllをEXEに含めて、展開時に site/lib/auto/Image に配置することができます。ppmが存在する時(以前)は、この方法を使用していました。

*5 : ソースから構築せず、MSYS2で配布されているパッケージを使用した場合、libcurlに依存しているため20以上のDLLが必要。

その他、補足

  • スクリプト内で、スレッド生成やforkをしている場合は、スクリプト最初の方で「use Image::Magick」しておきます。そのほうがメモリの節約になります。
  • Strawberry Perl 5.42.0.1 には「多くの追加パッケージ(perl/vendor/lib以下)」が標準で含まれています。
    • DBD::Pg, PAR::Packer, Net::SSLeay, CryptX等

まとめ

  • Image::Magickモジュールごと、PerlスクリプトをEXE化できるようになりました。
  • 新しいStrawberry PerlでもImage::Magickを使用可能になりました。