2008-11-17

wxWidgets でもクロスコンパイル

SourceForge.net Logo
回、FOX Toolkit について、Hello World! 的なプログラムを紹介しましたので、同じくクロスコンパイル用の RPM で公開している C++ 用 GUI ライブラリ wxWidgets についても同じように簡単なプログラムをコンパイルした例を紹介したいと思います。プログラムは以下のチュートリアル用ページをベースにしました。

Hello World - wxWidgets

表示される文字列を日本語にした他は、同じプログラムです。

// Hello World program with wxWidgets
#include "wx/wx.h"

class MyApp: public wxApp
{
virtual bool OnInit();
};

class MyFrame: public wxFrame
{
public:

MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);

void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);

DECLARE_EVENT_TABLE()
};

enum
{
ID_Quit = 1,
ID_About,
};

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Quit, MyFrame::OnQuit)
EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame(_T("こんにちは、世界!"),
wxPoint(50,50), wxSize(450,340));
frame->Show(TRUE);
SetTopWindow(frame);
return TRUE;
}

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
{
wxMenu *menuFile = new wxMenu;

menuFile->Append(ID_About, _T("このプログラムについて(&A)"));
menuFile->AppendSeparator();
menuFile->Append(ID_Quit, _T("終了(&x)"));

wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append(menuFile, _T("ファイル(&F)"));

SetMenuBar(menuBar);

CreateStatusBar();
SetStatusText(_T("wxWidgets へようこそ!"));
}

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close(TRUE);
}

void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
wxMessageBox(_T("はじめてのプログラム、こんにちは、世界!"),
_T("このプログラムについて"), wxOK | wxICON_INFORMATION, this);
}

コンパイルには、Linux の pkg-config を利用するので、MinGW のバイナリがインストールされている /usr/local/i386-mingw32/bin へパスを通しておきます。もし、Linux 側にも wxWidgets がインストールされている場合には、パスの順序を考慮する必要があります。

$ export PATH=$PATH:/usr/local/i386-mingw32/bin
$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/mingw32ce/bin:/home/bi
twalk/bin:/usr/local/i386-mingw32/bin
$ i386-mingw32-g++ hello.cpp `wx-config --libs` `wx-config --cxxflags`
-o hello.exe

$ ./hello.exe




Windows 上での動作確認もしようと思ったのですが、必要なランタイム DLL が多そうだったので、それはまた別の機会に紹介します。

$ i386-mingw32-objdump -p hello.exe | grep DLL
vma: Hint Time Forward DLL First
DLL Name: KERNEL32.dll
DLL Name: mingwm10.dll
DLL Name: msvcrt.dll
DLL Name: msvcrt.dll
DLL Name: wxbase28u_gcc_custom.dll
DLL Name: wxmsw28u_core_gcc_custom.dll

ちなみに、必要なランタイム DLL は wbc を使って調べることができます。

0 件のコメント: