Masahiro Kitajima
katon****@katon*****
2010年 2月 1日 (月) 00:26:08 JST
[ruby-list:46829] より。 現象: 以下の test.rb を .exe ファイルに変換します。 ---- test.rb ---- require 'iconv' ---- test.rb 終わり ---- C:\TMP>mkexy test.rb iconv.dll が無い環境で動かすため、レシピ・ファイルに iconv.dll の記述を追加します。 ---- test.exy ---- # Generated by mkexy # on 2010-01-31 19:48 general: startup: test.rb core: cui kcode: none file: test.rb: iconv.so: file: c:/ruby187/lib/ruby/1.8/i386-mswin32/iconv.so type: extension-library iconv.dll: # 追加 file: c:/ruby187/bin/iconv.dll # 追加 type: dynamic-library # 追加 ---- test.exy 終わり ---- C:\TMP>exerb test.exy C:\TMP>test.exe test.rb:1:in `require': No such file to load -- iconv (LoadError) from test.rb:1 require 'iconv' が失敗します。 require 'iconv.so' とすれば成功します。 原因: Exerb::Recipe#create_archive で .exe ファイルのアーカイブ部分に add_file_entry する際に、レシピ・ファイルの file ブロックに書かれ たファイル・リストを、ファイル名でソートしているため、ファイル名 部分が同名の .so と .dll を一緒に格納する場合、.dll、.so の順に格 納されています。 このような .exe ファイルを実行した場合、exerb/exerb.cpp: exerb_find_file_inside() で、先に .dll がマッチしてしまいます。 ここで扱われる DLL ファイルは、feature 名に '.so' を補っている 事から、中身が ruby 拡張ライブラリである事を想定していると考えら れ、ここでファイルの typeに拘わらず、拡張子が .dll であるファイル を処理しているのが間違いです。 対策案: exerb/exerb.cpp: exerb_find_file_inside() で .dll にマッチした 時、ファイルの type が拡張ライブラリでなければスキップするように すればよいと思います。パッチを添付します。 -- 北島雅博(かとんぼ) -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: exerb.cpp.patch 型: application/octet-stream サイズ: 610 バイト 説明: 無し Download