永井@知能.九工大です. >>>>> "N" == Noritsugu Nakamura <nnakamur / mxq.meshnet.or.jp> writes: N> ip.setup_libs( N> [nil, '/usr/local/lib/itcl/libtcl7.6jpi.so', ['/usr/local/lib/itcl/tcl7.6jp']], N> [nil, '/usr/local/lib/itcl/libtk4.2jpi.so', ['/usr/local/lib/itcl/tk4.2jp']], N> [nil, '/usr/local/lib/itcl/libitcl2.2jp.so', ['/usr/local/lib/itcl/itcl2.2jp']], N> ['Itcl', '/usr/local/lib/itcl/libitk2.2jp.so', ['/usr/local/lib/itcl/itk2.2jp']]) N> とかやったら、 N> ./tcltkextlib.rb:40: [BUG] Segmentation fault N> Abort N> とかでてしまいました。ruby 本体の問題か? N> ruby 1.1b9_16(98/04/28) [i586-linux] 使っているのですが。 確認しました. [incr tcl] は通常の wish などから load して利用するというのは できないようですね (少なくとも Tcl7.6/Tk4.0 では). ですから,segmentation fault した例のような方法ではダメで, 最初から導入したバイナリを作らなければいけないということなります. ruby から itcl を使いたい場合は, ruby のソースツリーの ext/tcltklib/extconf.rb に手を入れて,まず, ・tcl.h の search_header で itcl の tcl.h を見付けるように設定 ・tk.h の search_header で itcl の tk.h を見付けるように設定 itcl のインストール状況によりますが,これらはこんな感じでしょうか? -------------------------------------------------------------- search_header("tcl.h", "/usr/local/include/itcl*") search_header("tk.h", "/usr/local/include/itcl*") -------------------------------------------------------------- さらに, ・libtcl の search_lib で itcl の lib を見付けるように設定 ・libtk の search_lib で itcl の lib を見付けるように設定 同じく itcl のインストール状況によりますが, -------------------------------------------------------------- if have_header("tcl.h") && have_header("tk.h") && search_lib("libX11.{a,so}", "XOpenDisplay", "/usr/lib", "/usr/openwin/lib", "/usr/X11*/lib") && search_lib("libtcl{,7*,8*}.{a,so}", "Tcl_FindExecutable", "/usr/lib", "/usr/local/lib") && search_lib("libtk{,4*,8*}.{a,so}", "Tk_Init", "/usr/lib", "/usr/local/lib") $LDFLAGS = $libraries.collect{|path| "-L" + path}.join(" ") create_makefile("tcltklib") end -------------------------------------------------------------- の -------------------------------------------------------------- search_lib("libtcl{,7*,8*}.{a,so}", "Tcl_FindExecutable", "/usr/lib", "/usr/local/lib") && search_lib("libtk{,4*,8*}.{a,so}", "Tk_Init", "/usr/lib", "/usr/local/lib") -------------------------------------------------------------- の部分を -------------------------------------------------------------- search_lib("libtcl{,7*,8*}i.{a,so}", "Tcl_FindExecutable", "/usr/lib", "/usr/local/lib") && search_lib("libtk{,4*,8*}i.{a,so}", "Tk_Init", "/usr/lib", "/usr/local/lib") -------------------------------------------------------------- という感じでしょうか? # 'i' を追加して,libtcl7.6jpi.so や libtk4.2jpi.so を見付けるようにする. ^ ^ 多分,これで itcl を ruby から使えるはずです. こちらで簡単にテストしてみた限りでは, この ruby + (tcl/tk + [incr tcl]) において, setup_libs による Blt の load も含め, うまくいっているように見えます. なお,試してはいませんが,Extended Tcl の場合も setup_libs では導入できないだろうと思います. 多分,tcltklib.c の中で Tcl_Init , Tk_Init を呼び出している所で それぞれ TclX_Init , TkX_Init を呼び出すようにするだけで 導入できるのではないかと思います. -- 永井 秀利 (九工大 知能情報) nagai / ai.kyutech.ac.jp