[ruby-list:46829] Exerbでexe化したiconvを使ったスクリプトでエラーが発生する

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

[ruby-list:46829] Exerbでexe化したiconvを使ったスクリプトでエラーが発生する

Nakamatsu Shinji
Ruby-listの皆さんこんにちは。

snakaと申します。
表題のとおりの現象に遭遇したのですが、原因などご存知の方がいれば
教えてください。

現象の詳細は以下のとおりです。

まず、以下のようなRubyスクリプトを作成しインタプリタ上で実行可能で
あることを確認しました。

--- 元のスクリプト ---
require 'iconv'
UTF16toUTF8 = Iconv.new('utf-16be', 'utf-8')
p UTF16toUTF8.iconv('no bom')
----------------------------

次に上記スクリプトを、exerbコマンドでexe化しました。
そのときに使用したレシピファイルは以下のとおりです。
--- レシピファイル ---
# Generated by mkexy
# on 2010-01-29 00:22

general:
  startup: test.rb
  core: cui
  kcode: none

file:
  test.rb:
  iconv.so:
    file: C:/PROGRA~1/ruby-1.8/lib/ruby/1.8/i386-mswin32/iconv.so
    type: extension-library
  iconv.dll:
    file: C:/PROGRA~1/ruby-1.8/bin/iconv.dll
----------------------------

最初、mkexyコマンドで生成したレシピファイルには iconv.dll が含まれて
ませんでしたが、その状態でexeを実行すると、以下のエラーが出たため
加えてみました。

--- エラー(1) ---
test.rb:1:in `require': Win32API Error #126 --- 指定されたモジュールが見つかりません。
 (ExerbRuntime::Error)
        from test.rb:1
--------------------

すると、以下のようなエラーに変りました。
--- エラー(2) ---
test.rb:1:in `require': No such file to load -- iconv (LoadError)
        from test.rb:1
--------------------

ここでしばらく試行錯誤を繰り返したところ、元のスクリプトで"iconv"のrequireしている
箇所を"iconv.so"と拡張子付きで指定することで解決することができました。

--- 変更後のスクリプト ---
require 'iconv.so'
UTF16toUTF8 = Iconv.new('utf-16be', 'utf-8')
p UTF16toUTF8.iconv('no bom')
----------------------------------

一応、問題は回避できたんですが、根本原因がわからないのも気持ち悪いのでMLに
流してみました。
もし原因がわかるようでしたら教えてください。

環境は以下のとおりです。
- OS: Windows XP SP3
- Ruby: ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32]

Reply | Threaded
Open this post in threaded view
|

[ruby-list:46830] Re: Exerbでexe化したiconvを使ったスクリプトでエラーが発生する

Masahiro Kitajima
 かとんぼと申します。

 偶然ブログでこの件の記事をお見かけし、手元の環境で試したのです
が、最初の段階から現象は再現しませんでした。
 レシピファイルへの iconv.dll の記載追加や、reauire 'iconv.so'
とする必要もありませんでした。

> - OS: Windows XP SP3
> - Ruby: ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32]

 手元の環境は以下のとおりです。

- OS: Windows XP SP3
- ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]
- Ruby のインストール先:c:\ruby187
- Exerb 5.1.0(ruby 1.8.7p249 コア)
- iconv : iconv-1.9.1-dll.tar.bz2

 ここで、c:\ruby187 以下の内容を C:\Program Files\ruby-1.8 にコ
ピーした環境を作って試してみました。
 なぜか一度だけですが、以下の現象が再現しました。

    C:\tmp>mkexy test.rb
    test.rb:1:in `require': no such file to load -- iconv (LoadError)
            from test.rb:1

 この時生成された test.exy は以下の内容で、iconv.so が見つけられ
なかったようです。

---- test.exy ----
# Generated by mkexy
# on 2010-01-30 21:56

general:
  startup: test.rb
  core: cui
  kcode: none

file:
  test.rb:
---- test.exy ----

 ところが現象は一度きりで、以後 Windows を再起動しても、
mkexy test.rb でエラーとなる現象は再現できなくなりました。

 私のまとめは次のとおりです。^^;

(1) 最新の Exerb 5.1.0 でも、何らかの条件で mkexy が iconv.so が
    見つけられない事がある。
(2) しかし再現条件は不安定。

--
北島雅博(かとんぼ)


Reply | Threaded
Open this post in threaded view
|

[ruby-list:46832] Re: Exerbでexe化したiconvを使ったスクリプトでエラーが発生する

Nakamatsu Shinji
かとんぼさん

返信ありがとうごさいます。

念のため、ActiveScriptRubyを新しいものに入れ替えてみました。
以下のような環境で再度試してみました。

 ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]

Reply | Threaded
Open this post in threaded view
|

[ruby-list:46833] Re: Exerbでexe化したiconvを使ったスクリプトでエラーが発生する

Nakamatsu Shinji
In reply to this post by Masahiro Kitajima
※なんか、途中できれてました。すみません再送します。

かとんぼさん
返信ありがとうございます。

念のため、ASRのをあたらしいものに入れ替えてみました。
以下のような環境で再度確認しましたが、結果はおなじでした。

 - Windows XP SP3
 - ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]
 - Exerb 5.1.0 (コア:ruby187c.exc)
   ※コアのパッチレベルまでは確認してません(ASR添付のものそのまま)
 - iconv.dll はASRに添付されていたものをそのまま使ってます。

現象についての補足があります。
レシピファイルにiconv.dllを追加していない状態で作成したexeを、
iconv.dllが格納されているディレクトリ(*)へパスが通っていない環境で、
実行すると以下のエラーがコンソールに出力されます。
(* iconv.dllはASRインストール先のbinディレクトリに格納されています)

  test.rb:1:in `require': Win32API Error #126 --- 指定されたモジュールが
  見つかりません。
   (ExerbRuntime::Error)
          from test.rb:1

これと同時に、以下のようなダイアログが表示されます。

  ---------------------------
  test.exe - コンポーネントが見つかりません
  ---------------------------
  iconv.dll が見つからなかったため、このアプリケーションを開始できません
  でした。アプリケーションをインストールし直すとこの問題は解決される場合
  があります。
  ---------------------------
  OK
  ---------------------------

当初、iconv.dllへパスが通っている環境でのみ動作確認していたので、この
問題に気づきませんでしたが、他の環境で実行できない場合があることに気づき
先の投稿にあるような現象を確認しました。

うーん、なんでしょうね?

(10/01/30 22:49), Masahiro Kitajima wrote:

>  かとんぼと申します。
>
>  偶然ブログでこの件の記事をお見かけし、手元の環境で試したのです
> が、最初の段階から現象は再現しませんでした。
>  レシピファイルへの iconv.dll の記載追加や、reauire 'iconv.so'
> とする必要もありませんでした。
>
>> - OS: Windows XP SP3
>> - Ruby: ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32]
>
>  手元の環境は以下のとおりです。
>
> - OS: Windows XP SP3
> - ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]
> - Ruby のインストール先:c:\ruby187
> - Exerb 5.1.0(ruby 1.8.7p249 コア)
> - iconv : iconv-1.9.1-dll.tar.bz2
>
>  ここで、c:\ruby187 以下の内容を C:\Program Files\ruby-1.8 にコ
> ピーした環境を作って試してみました。
>  なぜか一度だけですが、以下の現象が再現しました。
>
>      C:\tmp>mkexy test.rb
>      test.rb:1:in `require': no such file to load -- iconv (LoadError)
>              from test.rb:1
>
>  この時生成された test.exy は以下の内容で、iconv.so が見つけられ
> なかったようです。
>
> ---- test.exy ----
> # Generated by mkexy
> # on 2010-01-30 21:56
>
> general:
>    startup: test.rb
>    core: cui
>    kcode: none
>
> file:
>    test.rb:
> ---- test.exy ----
>
>  ところが現象は一度きりで、以後 Windows を再起動しても、
> mkexy test.rb でエラーとなる現象は再現できなくなりました。
>
>  私のまとめは次のとおりです。^^;
>
> (1) 最新の Exerb 5.1.0 でも、何らかの条件で mkexy が iconv.so が
>      見つけられない事がある。
> (2) しかし再現条件は不安定。
>


Reply | Threaded
Open this post in threaded view
|

[ruby-list:46834] Re: Exerbでexe化したiconvを使ったスクリプトでエラーが発生する

Masahiro Kitajima
In reply to this post by Masahiro Kitajima
Masahiro Kitajimaさんの
Sat, 30 Jan 2010 22:49:24 +0900 [[ruby-list:46830] Re: Exerbでexe化したiconvを使ったスクリプトでエラーが発生する] から
>  なぜか一度だけですが、以下の現象が再現しました。
>
>     C:\tmp>mkexy test.rb
>     test.rb:1:in `require': no such file to load -- iconv (LoadError)
>             from test.rb:1
>
>  この時生成された test.exy は以下の内容で、iconv.so が見つけられ
> なかったようです。

 exerb/mkexy.rb は、$LOADED_FEATURES をもとにレシピ・ファイルに
追加するライブラリを特定しており、誤動作の余地は無さそうに見えま
す。
 手元で発生した上記現象は、実験環境が不完全なタイミングで実行し
てしまった結果のような気がしてきました。orz

 混乱を避けるため、以下はいったん取り下げます。

> (1) 最新の Exerb 5.1.0 でも、何らかの条件で mkexy が iconv.so が
>     見つけられない事がある。

--
北島雅博(かとんぼ)


Reply | Threaded
Open this post in threaded view
|

[ruby-list:46835] Re: Exerbでexe化したiconvを使ったスクリプトでエラーが発生する

Masahiro Kitajima
In reply to this post by Nakamatsu Shinji
 わかった気がします。つまり、以下のようなレシピ・ファイルで .exe
ファイルを作られたのだと思います。

---- test.exy ----
# Generated by mkexy
# on 2010-01-31 15:00

general:
  startup: test.rb
  core: cui
  kcode: none

file:
  test.rb:
  iconv.so:
    file: c:/xxxx/lib/ruby/1.8/i386-mswin32/iconv.so
    type: extension-library
  iconv.dll:
    file: c:/xxxx/bin/iconv.dll
    type: dynamic-library
---- test.exy ----

 作成された test.exe には、iconv.so と iconv.dll が同梱されます。
 require 'iconv.so' だとうまく行くのは、require 'iconv' でライブ
ラリを探す時に、iconv.dll が先に見つかってしまうという事かも知れ
ません。
 試しに iconv.dll の名前を適当に変えて、レシピ・ファイルでそれを
追加するように指示した場合は、require 'iconv' でエラーになりませ
んでした。

--
北島雅博(かとんぼ)