2008-02-24

C による Tcl/Tk 拡張 : カスタマイズした wish (2)

SourceForge.net Logo

回は、クロスコンパイラ編ということで、MinGW クロスコンパイラ環境で、Win32 用 Tcl/Tk の拡張パッケージをビルドしてみます。

コンパイル環境


コンパイル環境は、以下の通り MinGW Cross Compiler プロジェクトで公開している、コアパッケージと Tcl/Tk のパッケージを使用しています。なお、make は、Linux のものを使います。また、ビルド後に動作を確認するための wine もインストールしておきます。

Fedora 8 (i386)
mingw-binutils-2.18.50-3.fc8
mingw-gcc-core-4.2.1-4.fc8
mingw-runtime-3.14-2.fc8
mingw-w32api-3.11-2.fc8
mingw-tcltk-8.5.1-2.fc8
make-3.81-10.fc8
wine-core-0.9.55-1.fc8 と、依存しているパッケージ群

プログラム


プログラムのソースは、前回使用したものと同じ、kwish_main.ckwish_sub.c および kwish.h です。ビルドに使用するメイクファイルには、以下の Makefile.win を使います。

# Makefile.win

PREFIX = i386-mingw32-
CC = $(PREFIX)gcc
RM = rm -f

TARGET = kwish

OBJEXT = .o
TARGETEXT = .exe

DEFS =
INCLUDE = -I/usr/local/i386-mingw32/include
CFLAGS = -Wall -O2 $(DEFS) $(INCLUDE)
LDFLAGS = -L/usr/local/i386-mingw32/lib
TK_LIBS = -ltk -ltcl
WIN32_LIBS = -lws2_32 -lgdi32 -lcomdlg32 -limm32 \
-lcomctl32 -lshell32 -luuid -lole32 -loleaut32
LDFLAGS_CONSOLE = -mconsole
LDFLAGS_WINDOW = -mwindows
LIBS = $(TK_LIBS) $(WIN32_LIBS) $(LDFLAGS_WINDOW)

OBJS = \
kwish_main$(OBJEXT) \
kwish_sub$(OBJEXT)

all: kwish$(TARGETEXT)

kwish$(TARGETEXT): $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

.c.$(OBJEXT):
$(CC) -c $(CFLAGS) $< -o $@

$(OBJS): kwish.h

clean:
$(RM) kwish$(TARGETEXT) $(OBJS) *~

# Makefile.win

リンク時に使用するマクロ WIN32_LIBS にセットしたライブラリのリストは、tk8.5.1 をビルドした時に使用した Makefile のマクロ LIB に記述されているものをそのままコピーしました。

ビルドと実行


Makefile.win を、ソースと同じディレクトリ内に保存し、make コマンドで kwish.exe をビルドします。

$ make -fMakefile.win clean
rm -f kwish.exe kwish_main.o kwish_sub.o *~
$ make -fMakefile.win
i386-mingw32-gcc -Wall -O2 -I/usr/local/i386-mingw32/include
-c -o kwish_main.o kwish_main.c
i386-mingw32-gcc -Wall -O2 -I/usr/local/i386-mingw32/include
-c -o kwish_sub.o kwish_sub.c
i386-mingw32-gcc -o kwish.exe kwish_main.o kwish_sub.o
-L/usr/local/i386-mingw32/lib -ltk -ltcl -lws2_32 -lgdi32 -lcomdlg32
-limm32 -lcomctl32 -lshell32 -luuid -lole32 -loleaut32 -mwindows
$ ./kwish.exe
err:module:import_dll Library tcl85.dll (which is needed by
L"Z:\\home\\bitwalk\\work\\kwish\\kwish.exe") not found
err:module:import_dll Library tk85.dll (which is needed by
L"Z:\\home\\bitwalk\\work\\kwish\\kwish.exe") not found
err:module:LdrInitializeThunk Main exe initialization for
L"Z:\\home\\bitwalk\\work\\kwish\\kwish.exe" failed, status c0000135


Linux 用にビルドした kwish の時と同じようにして kwish.exe を実行しようとしても、Tcl/Tk の DLL が見つからないというエラーメッセージが出て実行できません。念のため objdump で kwish.exe がリンクしている DLL を調べてみましょう。

$ i386-mingw32-objdump -p kwish.exe | grep "DLL Name"
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
DLL Name: tcl85.dll
DLL Name: tk85.dll

実を言うと、この拡張 wish を実行させるためには、tcl85.dlltk85.dll の他に、wish アプリケーションを初期化する Tcl スクリプト init.tcl が必要になります。そのため、仮に Tcl/Tk のスタティックライブラリを利用してビルドして DLL に依存しないようにしても、拡張 wish を単体で動作させることはできません。しかし、とりあえず動作確認をするだけであれば、次のようにして実行させることができます。

$ cd /usr/local/i386-mingw32/bin
$ /home/bitwalk/work/kwish/kwish.exe
fixme:font:WineEngCreateFontInstance Untranslated charset 255
fixme:imm:ImmReleaseContext (0x10026, 0x158190): stub


wine を利用した Windows 版 kwish の実行例

この例では、/home/bitwalk/work/kwish/kwish.exe が、ビルドした拡張 wish です。

MinGW Cross Compiler プロジェクトのサイトでは、RPM パッケージ用にクロスコンパイルした Tcl/Tk のインストールファイルを zip ファイルにしてアップしてありますので、これを利用する方法もあります。[LIB] tcltk から、ここでは mingw-tcltk-8.5.1-2.zip をダウンロードします。

Linux 上では、ダウンロードした zip ファイルを次のように展開します。次に bin ディレクトリ内に、先ほどビルドした kwish.exe をコピーして実行します。

$ unzip mingw-tcltk-8.5.1-2.zip
Archive: mingw-tcltk-8.5.1-2.zip
creating: mingw-tcltk-8.5.1-2/
creating: mingw-tcltk-8.5.1-2/include/
creating: mingw-tcltk-8.5.1-2/bin/
creating: mingw-tcltk-8.5.1-2/lib/
inflating: mingw-tcltk-8.5.1-2/include/tk.h
:
(snip)
:
inflating: mingw-tcltk-8.5.1-2/lib/reg1.2/tclreg12.dll
inflating: mingw-tcltk-8.5.1-2/lib/reg1.2/pkgIndex.tcl
finishing deferred symbolic links:
mingw-tcltk-8.5.1-2/lib/libtk.dll.a -> /usr/local/i386-mingw32/lib/libtk85.a
mingw-tcltk-8.5.1-2/lib/libtcl.dll.a -> /usr/local/i386-mingw32/lib/libtcl85.a
$ cd mingw-tcltk-8.5.1-2/bin
$ cp ~/work/kwish/kwish.exe ./
$ ./kwish.exe
fixme:font:WineEngCreateFontInstance Untranslated charset 255
fixme:comm:set_queue_size insize 4096 outsize 4096 unimplemented stub
fixme:imm:ImmReleaseContext (0x10026, 0x158178): stub

Windows 上でも同様に、ダウンロードした zip ファイルを適当な解凍ツールで展開後、kwish.exebin フォルダ内へ移し、ダブルクリックして起動します。

Windows Vista における Windows 版 kwish の実行例

mingw-tcltk のインストールファイルは、kwish.exe を実行するための最小セットではありません。目的に応じて、不必要なファイルを削除してください。なお、単独のファイルで Tcl/Tk のアプリケーションを実行したい場合には、以下の関連情報を参照してみてください。

関連情報


[1] Starkit deployment technology
[2] freewrap
 

2 件のコメント:

匿名 さんのコメント...

せっかくですから、今回コンピュータを一台用意してFedora8を新規にインストール(旧マシンですが)。必要な環境を用意。記事のとおりにして勉強させてもらうことにしました。 wineまわりのことやら、バージョン8.5のことやら、疑問点があきらかになってきて、感謝しています。とりあえずお礼まで。

bitWalk さんのコメント...

Fedora 8 をインストールしたのですか。それであれば、このブログで紹介している内容をそのまま利用できて都合が良いですね。

頻度はそんなに高くないですが、少しずつ Tcl/Tk の拡張についての話題を取り上げていきたいと考えています。