VC++2005ExpressEditionでBayGUI

VC++ 2005 Express Editionを入れてみたのでとりあえずSDL版BayGUIをコンパイルしてみた。手順を残しておく。
(01) CVSからlibbayguiのtarボール*1を取得。
(02) E:\project\Mona\libbayguiに展開。
(03) てきとーにMakefileを書く。awt\TextArea.cppとlang\Thread.cppはエラーが出るので外す。

//Makefile_SDL
#
TARGETEXE = main.exe
TARGETLIB = baygui.lib
SOURCES = \
  awt\Button.cpp \
  awt\Checkbox.cpp \
  awt\CheckboxGroup.cpp \
  awt\Component.cpp \
  awt\Container.cpp \
  awt\FontMetrics.cpp \
  awt\Frame.cpp \
  awt\Graphics.cpp \
  awt\Image.cpp \
  awt\Label.cpp \
  awt\ListBox.cpp \
  awt\Scrollbar.cpp \
#  awt\TextArea.cpp \
  awt\TextField.cpp \
  awt\Window.cpp \
  lang\Object.cpp \
  lang\String.cpp \
#  lang\Thread.cpp \
  util\Hashtable.cpp \
  util\Vector.cpp
OBJECTS = $(SOURCES:.cpp=.obj)

SDLHOME = D:\Lib\SDL-1.2.9
INCLUDE = \
  /I. \
  /Ibaygui \
  /I"$(VCINSTALLDIR)"\INCLUDE \
  /I$(SDLHOME)\include
LIBS = \
  /LIBPATH:$(SDLHOME)\lib \
  SDL.lib \
  SDLmain.lib
#
LD = link
AR = lib

.SUFFIXES : .obj .cpp

all : $(TARGETEXE)

$(TARGETEXE) : $(TARGETLIB)
  $(CPP) /Fe$@ $(INCLUDE) $(@:.exe=.cpp) $(TARGETLIB) /link $(LIBS)

$(TARGETLIB) : $(OBJECTS)
  $(AR) /OUT:$@ $(OBJECTS)

.cpp.obj :
  $(CPP) /c /Fo$@ $(CPPFLAGS) $(INCLUDE) $<

clean :
  del $(OBJECTS) $(TARGETLIB) $(TARGETEXE)

(04) Make。

E:\project\Mona\libbaygui>nmake /f Makefile_SDL
Button.cpp
awt\Button.cpp : warning C4819: ファイルは、現在のコード ページ (932) で表示
できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式
で保存してください。
.\baygui.h(42) : fatal error C1083: include ファイルを開けません。'monapi.h'
:Invalid argument
(略)

(05) ソースはUTF-8で書かれているがどうもコンパイラが正しく解析できないみたい。他のコードに変換すればコンパイルされるが、それではBayGUIで日本語等を表示したときに文字化けすると思われる。悩ましいところ。ヘッダファイルのエラーメッセージはMONA用の定義が有効であったため。

//baygui.h
27: // ==================================================
28: // OS 定義部分
29: // ==================================================
30: #define MONA  1
31: //#define SDL 1

(06) SDL用の定義を有効にする。

//baygui.h
30: //#define MONA  1
31: #define SDL 1

(07) 文字コードはとりあえずMS932に変換することに。昔ながらのnkf*2を愛用。

E:\project\Mona\libbaygui>for /r %i in (*.cpp) do nkf --sjis --cp932 --overwrite %i

(08) 再度Make。

E:\project\Mona\libbaygui>nmake /f Makefile_SDL
Button.cpp
e:\project\mona\libbaygui\baygui_SDL.h(63) : error C3409: 空の属性
ブロックは認められません。

(09) エラー箇所はここ。ぜんぜん大丈夫じゃん…。

//baygui_SDL.h
62:  bool __internal2;
63:  char __reserved[64];
64:} guiserver_window;

(10) grepしてみたらVC++付属のヘッダファイルに__reservedがマクロ定義されているのを発見。

//sal.h
701:#define __nullnullterminated
702:#define __reserved                          __pre __null
703:#define __checkReturn                       __inner_checkReturn

(11) #undefしても平気そうだけど、とりあえず変数__reservedは使ってないみたいなので変数名を変える。

//baygui_SDL.h
62:  bool __internal2;
63:  char _reserved[64];
64:} guiserver_window;

(12) 更にMake。

E:\project\Mona\libbaygui>nmake /f Makefile_SDL

(13) 無事終了したので実行。

E:\project\Mona\libbaygui>main
awt\FontMetrics.cpp:baygui::FontMetrics::FontMetrics:60:ERROR: can not get font!

(14) フォントがないと怒られる。MONA12.MNF*3と、ついでに標準の背景画像MONAWALL.BMP*4をゲット。
(15) 再度実行。

E:\project\Mona\libbaygui>main

(16) ウィンドウが表示される。

IDE使わなかったので何が変わったのかぜんぜんわかってないよ…。