mieki256's diary



2022/08/19(金) [n年前の日記]

#2 [ruby][windows] exerbでRuby/SDLのスクリプトをexe化したかったけど無理だった

Ruby/SDL 1.3.1.1 を使ったRubyスクリプトを exerb 5.3.0 でexeに変換したかったけど、ちょっと無理っぽい気配になってきた。いや、無理。これたぶん無理。

環境は、Windows10 x64 21H2 + Ruby 1.8.7 p330 i386-mingw32 + rubysdl 1.3.1.1 + exerb 5.3.0。ちなみに、動作確認に使ってる別PCも Windows10 x64 21H2。

症状。 :

exerbで生成されたexeは、変換作業に用いたPC上では動作するけれど、別PC上では動作しなかった。

ss_exerb_error.png

検証に使ったソース。 :

以下は、exerb で exe化できないか試した際のRubyスクリプトソース。及び、exerb に渡す .exyファイル。Ruby/SDLを使ったWindows用スクリーンセーバ(の雛形)で、画面の中をRubyロゴ画像が跳ね回る処理をしている。

_rbsdlsav2.rb
_rbsdlsav2.exy

ちなみに、上記のスクリプト rbsdlsav2.rb は画面に画像を描画しているけれど、画像ファイルをbase64に変換してスクリプト内に含めてある版なので、別途画像ファイルを必要としない。

また、中に含めた画像ファイルは png ではなく bmp にしてある。png にすると、exe実行時、何故か以下のエラーが出てしまうので…。
> rbsdlsav2.exe
rbsdlsav2.rb:197:in `loadFromIO': Couldn't load image from IO: Failed loading png_create_info_struct: 指定されたモジュールが見つかりません。
 (SDL::Error)
        from rbsdlsav2.rb:197:in `get_surface_image_from_base64'
        from rbsdlsav2.rb:75:in `draw_fullscreen'
        from rbsdlsav2.rb:235

作業手順その他については、以下も参照のこと。

_試行錯誤の記録。その2 - exerbと格闘中 - mieki256's diary

調査に使ったツール。 :

ググったところ、Dependencies というツールを使えば、*.so や *.dll が必要としている *.dll 等を調べることができると知った。

_lucasg/Dependencies: A rewrite of the old legacy software "depends.exe" in C# for Windows devs to troubleshoot dll load dependencies issues.

このツールを導入して、sdl.so や sdl*.dll を開いて、どの .dll が要求されているのか調べていった。

原因その1。 :

不具合が発生した原因は2点ある。

原因その1。変換作業に使ったWindows10機には、C:\Windows\SysWOW64\ 以下に、何故かSDL関連のDLLがごっそりほとんど入っていた。おそらく、何かしらのアプリをインストールした際、知らない間に、SysWOW64\以下にSDL関連DLLがコピーされてしまったのだろう…。

そのため、Rubyスクリプトをexe化したソレを実行した際、そのファイルに足りてないDLLがあったとしても、SysWOW64\ 以下から足りてないDLLを呼び出してしまって、故に exe が動いてしまっていた。

しかし、別PCの SysWOW64\ 以下には、SDL関連DLLが全く入ってなかったので、足りてないDLLに遭遇したらどこからも呼び出すことができず、「指定されたモジュールが見つかりません」とエラーを出していた。

原因その2。 :

原因その2.今回足りてなかったファイルは、libfreetype-6.dll だった。sdl.so が SDL_ttf.dll を要求して、その SDL_ttf.dll が libfreetype-6.dll を要求していた。

ところが、そもそも、Ruby/SDL 1.3.1.1 (rubysdl-1.3.1.1-mswin32-1.8.6-p36.zip) には、libfreetype-6.dll が同梱されていなかった…。当然、Ruby 1.8.7 のインストールフォルダにもコピーされていないので、フォルダを眺めてSDL関連DLLを全て列挙したつもりが、libfreetype-6.dll だけ指定が抜けている状態になってしまった。

これがまた困ったことに、libfreetype-6.dll について .exy 内で記述を追記して exe を生成しても、正常に動作する exe にはならない。

と言うのも、exerb には、「各種ファイル名は17文字まで」という謎の制限があるようで、libfreetype-6.dll はその制限に引っ掛かってしまう。

生成した exe を実行すると、「Couldn't modify DLL's name in the import table. The name of the executable file is too long.」とエラーメッセージを出す。「ファイル名が長過ぎて扱えない」と言われているのだと思う。

余談。libfreetype-6.dll は、Ruby/SDL 2.1.1.1 の zip (rubysdl-2.1.1.1-mswin32-1.8.7-p174.zip) の中にあるものを利用してみた。

まあ、Ruby/SDL 1.3.1.1 と 2.1.1.1 のどちらを使うかと言えば、フツーは 2.1.1.1 を使うだろうから…。「Ruby/SDL 1.3.1.1 の zip はファイルが不足している」という罠にハマることは無いだろうなと…。

対策。 :

exerb に .exy を通じて、「各DLLを内包しろ」と指定すると、17文字を超えるファイル名を扱えなくてエラーを出すわけだけど。

しかし、それらのDLLが、exeファイルとは別ファイルとして同梱されている状態なら、17文字制限は絡んでこないので、exeもちゃんと動作してくれる。

つまり、対策としては…。
  • mkexy で生成した .exy に対して、DLL関連を追記して、どうにか1つのexeにしよう、などと考えてはいけない。
  • 必要な DLL は、exe と同階層にまとめて置いておくことを心掛ける。
こうすれば、一応は動作してくれる exe を、exerb を用いて作れなくもない。

ただ、今回は、スクリーンセーバを作りたいという話なので…。できれば、1つのexeファイルで動いてくれるほうがありがたいわけで…。

結論。 :

他の用途ならともかく、Ruby/SDLを使ってWindows用スクリーンセーバを作りたいなら、exerbは諦めてocraを使いましょう。という話になるのかなと。ocraで作ったexeは起動が遅いけど、その分簡単にexe化できるメリットもあるし…。

そもそも、exerb は Ruby 1.8 までしか対応してないので…。今時使われる Ruby は、Ruby 2.x、もしかすると Ruby 3.x だったりするはず。フツーは exerb を使いたくても使えないだろうから、今更な話ではあるなと…。今回、Ruby/SDL を Windows上で使いたいが故に、あえて Ruby 1.8 を使っただけなので…。「せっかく Ruby 1.8 を使うなら exerb もイケるかな」と欲を出しちゃって大変なことになったという…。

2022/08/20追記。 :

Windows上で Ruby/SDL 1.3.1.1 を利用する際に必要になるdllを一応列挙しておきます。
jpeg.dll
libcharset-1.dll
libfreetype-6.dll
libiconv-2.dll
libpng12.dll
libtiff.dll
ogg.dll
SDL.dll
SDL_image.dll
SDL_mixer.dll
SDL_ttf.dll
SGE.dll
smpeg.dll
vorbis.dll
vorbisfile.dll
zlib1.dll

Ruby 2.1.1.1 の場合は、またちょっと違ってくるかと…。rubysdl-2.1.1.1-mswin32-1.8.7-p174.zip 内の dll/ の中には以下が入っているようだけど…。
jpeg.dll
libcharset-1.dll
libfreetype-6.dll
libiconv-2.dll
libogg-0.dll
libpng12-0.dll
libtiff-3.dll
libvorbis-0.dll
libvorbisfile-3.dll
mikmod.dll
SDL.dll
SDL_image.dll
SDL_mixer.dll
SDL_ttf.dll
SGE.dll
smpeg.dll
zlib1.dll

Ruby/SDL 1.3.1.1 と比べて、以下のファイルがリネーム or 追加されている模様。
libogg-0.dll
libpng12-0.dll
libtiff-3.dll
libvorbis-0.dll
libvorbisfile-3.dll
mikmod.dll

以上です。

過去ログ表示

Prev - 2022/08 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project