fj.sys.sun での質問に私が回答したものです。
From: yamamori@tt.rim.or.jp (YAMAMORI Takenori) Newsgroups: fj.sys.sun Subject: Re: what __mb_cur_max!! Date: 16 Dec 1997 16:28:35 GMT Message-ID: <676a7j$hdl$1@news.tt.rim.or.jp> References: <34960CC5.70C9E4CA@cresco.co.jp> In article <34960CC5.70C9E4CA@cresco.co.jp>, haga <haga@cresco.co.jp> wrote: >非常に初歩的な質問だと思いますがどうしても分からないのです。 > >SS5にSunOS4.1.4+JLE1.1.4の環境下で >NSUG−CD’97からX11R6.3をインストール >しました。(バイナリ配布をコピーしただけです。) >SunOSにはパッチは特にあてていません。 > >そこでxtermを起動すると以下のエラーがでます。 > >"Warning: locale not supported by C library, locale unchanged" > >ktermを起動すると > >"ld.so: Undefined symbol: __mb_cur_max" > >とメッセージが表示されktermの起動が出来ません。 山森と申します。 NSUG-CD'97 は私も持っています。 SunOS4.1.4(non-JLE) で X11R6.3(fix-02) を使用しています。 これの binary の X11R6.3 を見てみましたが、どうやら non-JLE で、 かつ X11R6.3 の make 時に -DX_LOCALE を付けずに make されているようです。 __mb_cur_max というラベルは、non-JLE の SunOS4.1.4 の /usr/include/stdlib.h で定義されていて、ライブラリとしては /usr/lib/libc.so.1.9 の中にのみ存在し、JLE の /usr/lib/libc.so.101.9 には存在しません。 (JLE マシンでも、もし、/usr/compat がインストールされていれば、 /usr/compat/include/stdlib.h に、non-JLE の stdlib.h があるので、 それを /usr/include/stdlib.h と diff をとれば、違いがわかるでしょう) さて、NSUG-CD'97 では non-JLE 上で make されているため、 libX11.so.4.30 とかが /usr/lib/libc.so.1.9 内の __mb_cur_max を 必要としています。 しかし、NSUG-CD'97 の X11R6.3 を JLE マシンにインストールし、 そこで kterm とかを make すると、出来た kterm は libc.so.101.9 を 参照するようになってしまうため、__mb_cur_max が無いというエラーがでて 動作しません。 また、NSUG-CD'97 上の xterm 等をそのまま binary で実行した場合は、 libc.so.1.9 の方とリンクされますので __mb_cur_max のエラーは出ませんが、 これは non-JLE のライブラリのため、LANG=japanese で実行しようとすると、 locale がサポートされていないのでデフォルトの C にしますとの warning が出ます。 --- 解決方法ですが、NSUG-CD'97 のバイナリーをそのまま使う場合は、 warning を無視するか、LANG=C にするかしかないと思います。 (当然日本語は使えません) kterm についてですが、/usr/compat/bin/cc でコンパイルするか、 gcc の場合は /usr/local/lib を先に参照するのを利用して、 /usr/local/lib/libc.so.1.9 --> /usr/lib/libc.so.1.9 とあらかじめ シンボリックリンクを張っておいてから gcc で make すると、 libc.so.1.9 の方が使われ、__mb_cur_max の問題は解決します。 (あるいは unjle を使う) しかし、もうひとつ問題があって、NSUG-CD'97 の X11R6.3 が、 -DX_LOCALE を付けて make されていないため、このままでは 日本語 locale が使えません。 ところが、好運なことに、kterm-6.2.0 は setlocale() を呼んでいるので ダメなのですが、kterm-6.1.0 では、setlocale() を使わずに 日本語対応しているため、-DX_LOCALE 無しの Xlib 上でも 日本語表示が可能になります。 --- 参考までに、私の場合は NSUG-CD'97 の CD-ROM を受け取る前に、 UNIX USER の付録の CD-ROM から X11R6.3 を自分で make してしまいました。 最初は JLE 上に -DX_LOCALE 無しでやったのですが、 その後 JLE を外したくなり、non-JLE をインストールして、 その環境上で今度は -DX_LOCALE 付きで make し直しました。 (もちろん日本語環境 OK です) JLE --> non-JLE の移行中には、__mb_cur_max 関係のエラーが出て X11R6.3 が一時的に動かなくなった思い出があります。 ------------------------------- 山森丈範 yamamori ------------------------------- |
kterm-6.2.0 でも、XIM を使わなければ setlocale() を呼ばないようにできます。JLE の謎 も参照して下さい。