永井@知能.九工大です.

>>>>> "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