開発環境について
Linux であれば gcc を筆頭とするコンパイラ群やその他多くのスクリプト言語がはじめからついてくるのですが、Windows ですと外部から入手する必要があります。最近は Windows でも無償のコンパイラが充実してきており、お金をかけずに実用的な開発環境を実現できるようになりました。私がプライベートでよく使っているのは Borland C++ コマンドライン版と、GUI ツールキット wxWidgets の組み合わせです。
Borland C++ コマンドライン版は、もともと Borland 社 (現在は Embarcadero Technologies 社) の製品でしたが、今は無償で提供されています。make ファイルを作ってコマンドプロンプトからビルドする昔ながらの開発スタイルをとります。パッケージサイズが 9MB 程度と小さく、インストールの手間がほとんどかからないので、いろいろな PC に手軽に環境構築することができます。
Borland C++ コマンドライン版には Win32 API を提供するライブラリが付属しているので、これだけで GUI プログラムを作ることができます。とはいうものの、Win32 API でいりくんだプログラムを作るのはちょっと億劫です。wxWidgets は C++ のツールキットライブラリで、GUI プログラムを作成するのに便利なコントロールやクラスを提供します。もともと Borland C++ を使って開発していたようで、このコンパイラとの相性もばっちりです。
Borland C++ コマンドライン版を以下の手順でインストールします。
- Embarcadero Technologies の以下のリンクからインストーラをダウンロードします
[ダウンロード] - [トライアル/無償バージョン - C++ Builder] - [C++ Compiler 5.5] - インストーラ freecommandLineTools.exe を実行します。以下、インストール先ディレクトリを C:\Borland\BCC55 と仮定します。
- 環境変数 PATH に C:\Borland\BCC55\Bin を追加します。
- C:\Borland\BCC55\Bin にファイル bcc32.cfg を作成し、以下の内容を記述します。
-I"C:\Borland\BCC55\include"
-L"C:\Borland\BCC55\lib" - C:\Borland\BCC55\Bin にファイル ilink32.cfg を作成し、以下の内容を記述します。
-L"C:\Borland\BCC55\lib"
適当なソースファイルを作って以下のようにコマンドを実行すると、実行ファイルが生成されます。
bcc32 hello.cpp
wxWidgets を以下の手順でインストールします。
- wxWidgets の Downloads から Current Stable Release の wxMSW インストーラをダウンロードします。2009 年 9 月現在の最新版は 2.8.10 です。
- インストーラ wxMSW-x.x.x-Setup.exe (x.x.x はバージョン番号) を実行します。インストール先のディレクトリに C:\Borland\BCC55\wxWidgets-x.x.x を指定します。
- C:\Borland\BCC55\wxWidgets-x.x.x\build\msw ディレクトリで以下のコマンドを実行します。
make -f makefile.bcc BUILD=release
かなり時間がかかるので気長に待ちましょう (Celeron 2.66GHz, RAM 504MB, Windows XP の環境で 8 分 ほどかかりました)。
ためしに、wxWidgets で簡単なプログラムを作ってみます。
適当なディレクトリ内に以下のファイルを作成し (まとめてダウンロード) 、make を実行します。Makefile 中の TARGET, SRCS, RCFILE の値を書き換えることで、いろいろなプロジェクトを作ることができます。なお、この Makefile は Borland Make (上記インストール手順にのっとれば C:\Borland\BCC55\Bin\make.exe) 用です。Cygwin, Mingw などの環境を入れている方は、GNU Make が実行されないよう気をつけてください。
- [Makefile]
!if !$d(WXVER)
WXVER = 2.8.10
!endif
TARGET = HelloWorld.exe
SRCS = HelloWorld.cpp
RCFILE = HelloWorld.rc
#------------------------------------------------------------------------------
WXDIR = $(MAKEDIR)\..\wxWidgets-$(WXVER)
CFLAGS = -v -P -Od -a8 -g0 -D__WXMSW__ -DNOPCH -w-8057 -I. -I.. \
-I$(MAKEDIR)\..\Include \
-I$(WXDIR)\lib\bcc_lib\msw \
-I$(WXDIR)\include
RCFLAGS = -32 -r -d__WXMSW__ \
-i$(MAKEDIR)\..\include \
-i$(WXDIR)\lib\bcc_lib\msw \
-i$(WXDIR)\include
LDFLAGS = -Tpe -q -v -aa \
-L$(MAKEDIR)\..\Lib \
-L$(MAKEDIR)\..\Lib\psdk \
-L$(WXDIR)\lib\bcc_lib
OBJS = $(SRCS:.cpp=.obj)
RESFILE = $(RCFILE:.rc=.res)
LIBS = wxbase28.lib wxmsw28_adv.lib wxmsw28_core.lib wxmsw28_html.lib \
wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib \
ole2w32.lib oleacc.lib odbc32.lib import32.lib cw32mt.lib
.cpp.obj:
@bcc32 -q -c $(CFLAGS) -o$@ $<
.rc.res:
@brcc32 $(RCFLAGS) -fo$@ $<
all: $(TARGET)
$(TARGET): $(OBJS) $(RESFILE)
ilink32 $(LDFLAGS) $(LIBPATHFLAGS) c0w32.obj $(OBJS),$@,,$(LIBS),,$(RESFILE)
clean:
del $(TARGET) $(OBJS) $(RESFILE) \
$(TARGET:.exe=.tds) $(TARGET:.exe=.map) \
$(TARGET:.exe=.ils) $(TARGET:.exe=.ilf) \
$(TARGET:.exe=.ild) $(TARGET:.exe=.ilc) \
$(TARGET:.exe=.tr2) $(TARGET:.exe=.td2)- [HelloWorld.cpp]
#include <wx/wx.h>
class App : public wxApp {
public:
virtual bool OnInit();
};
class Frame : public wxFrame {
private:
enum {
ID_BTN_HelloWorld = 1000,
};
public:
Frame();
private:
DECLARE_EVENT_TABLE()
void OnButton_HelloWorld(wxCommandEvent &event);
};
IMPLEMENT_APP(App)
bool App::OnInit()
{
Frame *pFrame = new Frame();
pFrame->Show();
SetTopWindow(pFrame);
return true;
}
Frame::Frame() : wxFrame(NULL, wxID_ANY, wxT("HelloWorld"))
{
new wxButton(this, ID_BTN_HelloWorld, wxT("Hello World"));
}
BEGIN_EVENT_TABLE(Frame, wxFrame)
EVT_BUTTON(ID_BTN_HelloWorld, Frame::OnButton_HelloWorld)
END_EVENT_TABLE()
void Frame::OnButton_HelloWorld(wxCommandEvent &event)
{
::wxMessageBox(wxT("Button was pushed"), wxT("HelloWorld"));
}- [HelloWorld.rc]
(空のファイル)
この記事へのコメントは終了しました。
コメント