From: Kenta Murata Date: 2007-12-25T23:56:23+09:00 Subject: [ruby-dev:32789] ruby を --with-static-linked-ext でビルドするとスクリプトを評価できません むらたです. こんな時間の報告で誠に申し訳ないのですが, --with-statick-linked-ext を指定してビルドすると, ext/json/ext/generator/generator.c で定義されている Init_generator 内の次の行で例外が発生してしまい, スクリプトを実行できません. (808行目) eGeneratorError = rb_path2class("JSON::GeneratorError"); この症状は,インタプリタの初期化フェーズでスタティックリンクされた拡張モジュールが初期化される時に発生します. 次のようなコマンドラインで症状を確認できます muraken@dirac:~/ruby/trunk$ LD_LIBRARY_PATH=. ./ruby -e 'p 1' json/ext/generator.so: undefined class/module JSON::GeneratorError (ArgumentError) 動的リンクされる場合,このモジュールは ext/json/lib/json/ext.rb 内で require されるのですが, このモジュールが require される前に ext/json/lib/json/common.rb が require され,その中で JSON::GeneratorError が定義されるため,動的リンクの場合は発生しません. C で作られたモジュールと Ruby で書かれたライブラリがこのような依存関係を持つ場合, どのように修正することが望ましいのでしょうか?私の場合は,Init_generator 内で rb_require('json/common') とやってお茶を濁してしまいそうです.これで正しいでしょうか? 最後に添付するパッチを当てると,以下のように正常に動作します. muraken@dirac:~/ruby/trunk$ LD_LIBRARY_PATH=. ./ruby -I ext/json/lib -e 'p 1' 1 -- Kenta Murata OpenPGP FP = FA26 35D7 4F98 3498 0810 E0D5 F213 966F E9EB 0BCC Index: ext/json/ext/generator/generator.c =================================================================== --- ext/json/ext/generator/generator.c (revision 14707) +++ ext/json/ext/generator/generator.c (working copy) @@ -802,6 +802,7 @@ */ void Init_generator() { + rb_require("json/common"); mJSON = rb_define_module("JSON"); mExt = rb_define_module_under(mJSON, "Ext"); mGenerator = rb_define_module_under(mExt, "Generator");