[Fedora 11]

wxWidgets を利用したクロスコンパイル

wxWidgets はクロスプラットホームなウィジェット・ツールキットです。C++ で記述されており、Windows を初め Mac OS X、Linux など多くの OS で動かすことができます。各コンポーネントの描画を OS に行わせているため、各々の OS に調和したコンポーネントを表示できます。wxWidgets ライブラリの使用および配布条件は、wxWindows Library Licence, Version 3.1 に従っています。


SourceForge.net Logo   MinGW クロスコンパイル用 wxWidgwets の入手先
  [LIB] wxWidgets
  wxWidgwets 対応の filesystem 入手先
  [CORE] filesystem

最初は Hello World

wxWidgets の RPM パッケージは、右に示したサイトからダウンロードしてご利用ください。なお、Fedora 標準の mingw32-filesystem では、依存関係を一部解決できないので、不具合を直したものを用意しました。同じく右のサイトからダウンロード/アップグレードしてご利用ください。

さて、wxWidgets ライブラリを用いたクロスコンパイルでも、最初は Hello World プログラムを扱います。以下の hello_wx.cpp は、wxWidgets のチュートリアルにあるサンプルをベースに、表示する文字列を日本語に変更したものです。

List: hello_wx.cpp

// 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);
}
// END PROGRAM
// hello_wx.cpp

コンパイルは、wx-config を使って次の様にします。コンパイルの前に、環境変数 PATHに、MinGW クロスコンパイルされたバイナリへのパスを追加しておく必要があります。

wx-config を利用したクロスコンパイル

$ export PATH=$PATH:/usr/i686-pc-mingw32/sys-root/mingw/bin
$ i686-pc-mingw32-g++ -s hello.cpp `wx-config --libs` `wx-config --cxxflags` -o 
hello.exe
$ ./hello.exe &

     

hello.exe の実行例 (Wine)

ページ先頭に戻る

ランタイムライブラリの収集

クロスコンパイルしたバイナリを Windows 上で実行するためには、wxWidgets などの DLL(ランタイムライブラリ)が必要になります。ランタイムライブラリを一式 Windows 側で用意しておけば、毎回、必要な DLL をコピーして Windows 側にコピーする必要はないのですが、ここでは、まず、必要な DLL をクロスコンパイル環境からコピーする方法を紹介します。

クロスコンパイルしたバイナリが利用している DLL を調べるには、MinGW クロスコンパイル環境用のバイナリユーティリティ (binutils) の i686-pc-mingw32-objdump を利用します。

$ i686-pc-mingw32-objdump -p hello.exe | grep "DLL Name:"
	DLL Name: KERNEL32.dll
	DLL Name: mingwm10.dll
	DLL Name: msvcrt.dll
	DLL Name: msvcrt.dll
	DLL Name: wxbase290u_gcc_custom.dll
	DLL Name: wxmsw290u_core_gcc_custom.dll
	DLL Name: libgcc_s_sjlj-1.dll
$

これらの DLL が、他の DLL を参照している可能性がありますので、手作業で調べるのであれば、DLL のひとつひとつをさらに i686-pc-mingw32-objdump で調べる必要があります。ただ、MinGW のクロスコンパイル環境では、KERNEL32.dllmsvcrt.dll など、Windows システムで使う DLL の実体が存在していなかったりもします。

SourceForge.net Logo   wbc の入手先
  [UTIL] wbc

そこで、ここでは wbc (Windows Binary Checker) を利用することにします。wbc は、特定の Winodws バイナリが依存している DLL を全て調べ、コピーして zip ファイルにする、MinGW クロスコンパイル用のユーティリティで、(Linux の)Tcl/Tk(バージョン 8.5 以上が必要)で記述されています。右のサイトから wbc の RPM をダウンロードしてインストールします。

$ su
パスワード:
# rpm -ivh wbc-0.14-1.fc11.noarch.rpm
準備中...                ########################################### [100%]
   1:wbc                    ########################################### [100%]
# exit
exit
$ wbc &

wbc の起動後の状態

ボタンをクリックすると、ディレクトリを選択するウィンドウが表示されますので、hello.exe のあるディレクトリを選択して、OK ボタンをクリックします。

ディレクトリの選択

メインのウィンドウには、ディレクトリ内のファイルが表示されます。Windows のバイナリには、ファイル名の左側に、 のマークが付いています。これをクリックすると、マークが に替わり、直接依存する DLL のリストが表示されます。

依存する DLL を調べるバイナリの選択

Windows 上で実行するバイナリを選択した上で ボタンをクリックすると、関連する DLL を全てを表示したウィンドウが作成されます。ここから関連するファイルを全て集めた zip ファイルを作成することができます。

ボタンをクリックして、zip ファイルを出力するディレクトリを選択します。 ボタンをクリックすると指定した出力先に zip ファイル (hello.zip) が生成されます。

Windows バイナリと、依存する DLL 全ての一覧

しばらくすると、zip ファイル (hello.zip) の生成が完了し、圧縮されたファイルの一覧が表示されます。

コピーされて圧縮されたファイルの一覧

赤字の英文で書かれている様に、もし、圧縮したファイルを配布目的に使用する場合は、圧縮したファイルの配布条件に従うよう、自己責任で取り扱ってくださるようお願いします。wbc では、配布条件を調べ、必要なソースファイルを収集することまではカバーしていません。

ページ先頭に戻る

Windows での実行例

wbc で生成した hello.zip を、Windows にコピーして展開してから hello.exe を実行した例を、以下に示しました。

hello.exe の実行例 (Windows Vista)

ページ先頭に戻る

参考サイト

ページ先頭に戻る
(C) 2009 - 2017 Fuhito Suguri
クリエイティブ・コモンズ・ライセンス
This site by Fuhito Suguri is licensed under a Creative Commons 表示 - 継承 3.0 Unported License.
Ads by Sitemix