ビルド2


wxWidgets2.9.4を MinGW on cygwin1.7.17でビルドしてみました。MSYSではありません。

configure、make

前回のようにソースの改竄もしないので簡単ですが、cygwin上でビルドするため、クロスビルド(クロスコンパイル)の指定、つまり、hostオプションの指定が必要です。

configureのヘルプより

System types:
  --build=BUILD     configure for building on BUILD [guessed]
                    'BUILD'上でビルドのための設定を行う(configure) [既定:自動推定]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
                    'HOST'上で実行されるプログラムをビルドするための
                    クロスコンパイルを行う [既定:'BUILD']

cygwin上でMinGW32用のプログラムをビルドするということは...

$ ../configure -build=i686-pc-cygwin -host=i686-pc-mingw32

前回の記事と同様にbuild-releaseフォルダを作って、そこでビルドします。今回のビルドは、MinGW用の32bit、リリース、DLL版となります。

複数のクロスコンパイル環境があると頭の中がぐちゃぐちゃになるので、この際、cygwinクリーンインストールしてしまいました。

$ uname -a
CYGWIN_NT-6.1-WOW64 etcpc 1.7.17(0.262/5/3) 2012-10-19 14:39 i686 Cygwin

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-cygwin/4.5.3/lto-wrapper.exe
Target: i686-pc-cygwin
コンフィグオプション: /gnu/gcc/releases/respins/4.5.3-3/gcc4-4...
スレッドモデル: posix
gcc version 4.5.3 (GCC)

$ ls -F /usr
bin/             i686-pc-mingw32/  lib/    sbin/   src/
i686-pc-cygwin/  include/          local/  share/  tmp/


setup.exeでgcc4とmingwをインストールすれば、/usrフォルダに i686-pc-cygwini686-pc-mingw32フォルダが作成されてます。
後は、configure、make、make install、その後、samplesフォルダに降りて、makeします。

configureオプションでmsw、openGLは指定していませんが、samples/openGLのcube、isosurf、penguinは動いています。

このライブラリはDLLとしてビルドしたので、環境変数PATHにつぎのものを加えます。

c:\cygwin\usr\i686-pc-mingw32\sys-root\mingw\bin;
c:\cygwin\usr\local\lib;
c:\cygwin\usr\local\bin;
c:\cygwin\usr\sbin;
c:\cygwin\bin;


無用な設定もあるやも知れませんが、少なくともwxWidgetsのサンプルがxxxxx.dllが無いという理由で起動しない場合は、これらのようなパスを環境変数PATHに加えて、windowsに伝えてください。PATHを通す以外にも、生成されたDLLをごっそりSystem32に移動してもいいです。PATHを通すのが僕の好みということに過ぎません。お好きな方法をWindowsが使用するDLL検索パスを見て選択して下さい。

HelloWorld

// -*- coding: utf-8-unix -*-
// wxWidgets "Hello world" Program
// For compilers that support precompilation, includes "wx/wx.h".

#include <wx/wxprec.h>

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

class MyFrame: public wxFrame
{
public:
  MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
private:
  void OnHello(wxCommandEvent& event);
  void OnExit(wxCommandEvent& event);
  void OnAbout(wxCommandEvent& event);

  wxDECLARE_EVENT_TABLE();
};

enum{
  ID_Hello = 1
};

wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
  EVT_MENU(ID_Hello, MyFrame::OnHello)
  EVT_MENU(wxID_EXIT, MyFrame::OnExit)
  EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
wxEND_EVENT_TABLE()

wxIMPLEMENT_APP(MyApp);

bool MyApp::OnInit()
{
  MyFrame *frame = new MyFrame( wxT("Hello World♪こんにちは〜こんにちは〜世界の窓から〜"),
				wxPoint(50, 50), wxSize(450, 340) );
  frame->Show( true );
  return true;
}

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
  : wxFrame(NULL, wxID_ANY, title, pos, size)
{
  wxMenu *menuFile = new wxMenu;
  menuFile->Append(ID_Hello, wxT("こんにちは(&H)...\tCtrl-H"),
		   "Help string shown in status bar for this menu item");
  menuFile->AppendSeparator();
  menuFile->Append(wxID_EXIT);

  wxMenu *menuHelp = new wxMenu;
  menuHelp->Append(wxID_ABOUT);

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

  SetMenuBar( menuBar );

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

void MyFrame::OnExit(wxCommandEvent& event)
{
  Close( true );
}

void MyFrame::OnAbout(wxCommandEvent& event)
{
  wxMessageBox( wxT("これはwxWidgetsの「こんにちは世界よ!」サンプルです。"),
		"About Hello World", wxOK | wxICON_INFORMATION );
}

void MyFrame::OnHello(wxCommandEvent& event)
{
  wxLogMessage("Hello World!");
}
# -*- coding: utf-8-unix -*-

CXX = $(shell wx-config --cxx)
PROGRAM = HelloWorld
OBJECTS = $(PROGRAM).o

# implementation

.SUFFIXES: .o .cpp

.cpp.o :
	$(CXX) -c `wx-config --cxxflags` -DWX_PRECOMP -o $@ $<

all: $(PROGRAM)

$(PROGRAM): $(OBJECTS)
	$(CXX) -o $(PROGRAM) $(OBJECTS) `wx-config --libs`

clean:
	rm -f *.o $(PROGRAM)


複数のhostが存在する場合は、つぎのようにhostを明示的に指定する必要があると思います(未確認)。

wx-config --host=i686-pc-ming32 --cxxflags
wx-config --host=i686-pc-ming32 --libs

前回、プレコンパイルが効いてないなぁと思ってたのですが、-DWX_PRECOMP の指定が必要でした。wx/wxprec.h 内で条件判定ありです。DOS窓を開かないためのオプション -mwindows はwx-configが返してくれるようですね。

蛇足

これは、楽チンだ。やっぱり、寄らば大樹ということです。MinGW32 on Cygwin でいきます。

蛇足2

なぜ、(MSYSでなくて)cygwinなのか?これまで、深く考えたこともないし、相違を比較することもしていません。使用している主要なツールも、GUNPACK(emacs24)、TeXLive(LaTeX)、dviout(プレビューア)、PDF、visual studio・・・いずれもcygwinとは関係ないので必然性はないですが、あえてMSYSである必然性もないという程度で、現状維持とします。
いや、そもそもMicrosoft Visual Studioでも構わないはずなのに、なぜcygwin上でクロスコンパイルなのか?きっと、GNUの心根が好きだというまったく情緒的な理由です(財布にやさしいからという実利的な理由も考えられますが、それが本当だとしても、きっぱり否定します)。