今回は、クロスコンパイラ編ということで、MinGW クロスコンパイラ環境で、Win32 用 Tcl/Tk の拡張パッケージをビルドしてみます。
コンパイル環境
コンパイル環境は、以下の通り
MinGW Cross Compiler プロジェクトで公開している、コアパッケージと Tcl/Tk のパッケージを使用しています。なお、make は、Linux のものを使います。また、ビルド後に動作を確認するための wine もインストールしておきます。
Fedora 8 (i386)mingw-binutils-2.18.50-3.fc8mingw-gcc-core-4.2.1-4.fc8mingw-runtime-3.14-2.fc8mingw-w32api-3.11-2.fc8mingw-tcltk-8.5.1-2.fc8make-3.81-10.fc8wine-core-0.9.55-1.fc8 と、依存しているパッケージ群
プログラム
プログラムのソースは、前回使用したものと同じ、
kwish_main.c、
kwish_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.dll と
tk85.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.exe を
bin フォルダ内へ移し、ダブルクリックして起動します。
Windows Vista における Windows 版 kwish の実行例
mingw-tcltk のインストールファイルは、
kwish.exe を実行するための最小セットではありません。目的に応じて、不必要なファイルを削除してください。なお、単独のファイルで Tcl/Tk のアプリケーションを実行したい場合には、以下の関連情報を参照してみてください。
関連情報
[1]
Starkit deployment technology[2]
freewrap
2 件のコメント:
せっかくですから、今回コンピュータを一台用意してFedora8を新規にインストール(旧マシンですが)。必要な環境を用意。記事のとおりにして勉強させてもらうことにしました。 wineまわりのことやら、バージョン8.5のことやら、疑問点があきらかになってきて、感謝しています。とりあえずお礼まで。
Fedora 8 をインストールしたのですか。それであれば、このブログで紹介している内容をそのまま利用できて都合が良いですね。
頻度はそんなに高くないですが、少しずつ Tcl/Tk の拡張についての話題を取り上げていきたいと考えています。
コメントを投稿