連載
環境
Windows 8 32bit
MingWのインストール
公式からインストール、ここではC:\local\MinGWにインストール。パッケージは以下
wxWidgetsのビルド
公式からwxWidgets-3.0.2.7zをダウンロードして、C:\local\wxWidgets-3.0.2に展開。
C:\local\MinGW\msys\1.0\msys.batを実行しmsysを開く。
Debugでビルドする。
1 2 |
$ cd /c/local/wxWidgets-3.0.2/build/msw/ $ mingw32-make.exe -f makefile.gcc BUILD=debug UNICODE=1 SHARED=0 MONOLITHIC=0 CXXFLAGS="-fno-keep-inline-dllexport -std=gnu++11" |
成功すればC:\local\wxWidgets-3.0.2\lib\gcc_lib以下にファイルができる。
EclipseCDTのインストール
公式からダウンロード、ここではeclipse-cpp-neon-1a-win32.zipをダウンロードし、C:\local\eclipseに展開。
起動用バッチC:\local\eclipse\start.batを作成。
1 2 |
set PATH=C:\local\MinGW\bin;C:\local\MinGW\msys\1.0\bin;%PATH% start eclipse.exe |
C++ソースhello.cppを追加し以下のように作成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#include <wx/wxprec.h> #ifndef WX_PRECOMP #include <wx/wx.h> #endif class MyApp: public wxApp { public: virtual bool OnInit(); }; class MyFrame: public wxFrame { public: MyFrame(); private: void OnHello(wxCommandEvent& event); void OnExit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); }; enum { ID_Hello = 1 }; wxIMPLEMENT_APP(MyApp); bool MyApp::OnInit() { MyFrame *frame = new MyFrame(); frame->Show( true ); return true; } MyFrame::MyFrame() : wxFrame(NULL, wxID_ANY, "Hello World") { wxMenu *menuFile = new wxMenu; menuFile->Append(ID_Hello, "&Hello...\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, "&File" ); menuBar->Append( menuHelp, "&Help" ); SetMenuBar( menuBar ); CreateStatusBar(); SetStatusText( "Welcome to wxWidgets!" ); Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello); Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT); Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT); } void MyFrame::OnExit(wxCommandEvent& event) { Close( true ); } void MyFrame::OnAbout(wxCommandEvent& event) { wxMessageBox( "This is a wxWidgets' Hello world sample", "About Hello World", wxOK | wxICON_INFORMATION ); } void MyFrame::OnHello(wxCommandEvent& event) { wxLogMessage("Hello world from wxWidgets!"); } |
ここではプロジェクトのパスなどの設定は環境変数で行う。このプロジェクト自体をLinuxでも開きたいのでそうする。start.batを以下のように書き換える。
1 2 3 4 5 6 7 8 9 10 11 12 |
set PATH=C:\local\MinGW\bin;C:\local\MinGW\msys\1.0\bin;%PATH% set CPATH=C:\local\wxWidgets-3.0.2\include;C:\local\wxWidgets-3.0.2\lib\gcc_lib\mswud set LIBRARY_PATH=C:\local\wxWidgets-3.0.2\lib\gcc_lib set CPPFLAGS=-fno-keep-inline-dllexport -std=gnu++11 -static-libstdc++ set WINWXLIBS=-Wl,--start-group -lwxbase30ud -lwxbase30ud_xml -lwxbase30ud_net -lwxexpatd -lwxjpegd -lwxmsw30ud_adv -lwxmsw30ud_core -lwxmsw30ud_html -lwxmsw30ud_media -lwxmsw30ud_webview -lwxmsw30ud_xrc -lwxpngd -lwxregexud -lwxscintillad -lwxtiffd -lwxzlibd -lwxmsw30ud_aui -lwxmsw30ud_ribbon -lwxmsw30ud_propgrid -lwxmsw30ud_richtext -lwxmsw30ud_stc -lwxmsw30ud_gl -Wl,--end-group set WINLIBS=-luser32 -lgdi32 -luuid -lComdlg32 -lOle32 -lComctl32 -lWinspool -lOleAut32 set WXLIBFLAGS=%WINWXLIBS% %WINLIBS% start eclipse.exe |
ビルド確認のため、-Wl,–start-groupと-Wl,–end-groupを指定している。このフラグはライブラリの循環参照をしてくれるため記述の順番を考慮しなくていい。しかし遅くなるとのことなのでいったんビルドが成功したら外したほうがいいがその時リンクエラーになるかもしれない。
ここで作成したCPPFLAGSとWXLIBFLAGSをプロジェクトの設定で追加する。
ビルドして実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
19:27:03 **** Build of configuration Debug for project wxHelloWorld **** make all Building file: ../hello.cpp Invoking: Cross G++ Compiler g++ -O0 -g3 -Wall -c -fmessage-length=0 -fno-keep-inline-dllexport -std=gnu++11 -static-libstdc++ -MMD -MP -MF"hello.d" -MT"hello.o" -o "hello.o" "../hello.cpp" Finished building: ../hello.cpp Building target: wxHelloWorld Invoking: Cross G++ Linker g++ -o "wxHelloWorld" ./hello.o -Wl,--start-group -lwxbase30ud -lwxbase30ud_xml -lwxbase30ud_net -lwxexpatd -lwxjpegd -lwxmsw30ud_adv -lwxmsw30ud_core -lwxmsw30ud_html -lwxmsw30ud_media -lwxmsw30ud_webview -lwxmsw30ud_xrc -lwxpngd -lwxregexud -lwxscintillad -lwxtiffd -lwxzlibd -lwxmsw30ud_aui -lwxmsw30ud_ribbon -lwxmsw30ud_propgrid -lwxmsw30ud_richtext -lwxmsw30ud_stc -lwxmsw30ud_gl -Wl,--end-group -luser32 -lgdi32 -luuid -lComdlg32 -lOle32 -lComctl32 -lWinspool -lOleAut32 Finished building target: wxHelloWorld 19:27:52 Build Finished (took 48s.560ms) |
リリースバージョンも含めてちゃんとつくる
wxWidgetsのビルド
1 |
$ mingw32-make.exe -f makefile.gcc BUILD=release UNICODE=1 SHARED=0 MONOLITHIC=0 CXXFLAGS="-fno-keep-inline-dllexport -std=gnu++11" |
start.bat編集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
set PATH=C:\local\MinGW\bin;C:\local\MinGW\msys\1.0\bin;%PATH% set LIBRARY_PATH=C:\local\wxWidgets-3.0.2\lib\gcc_lib set CPATH= set WINLIBS=-luser32 -lgdi32 -luuid -lComdlg32 -lOle32 -lComctl32 -lWinspool -lOleAut32 set CPPFLAGSD=-I"C:\local\wxWidgets-3.0.2\include" -I"C:\local\wxWidgets-3.0.2\lib\gcc_lib\mswud" -fno-keep-inline-dllexport -std=gnu++11 -static-libgcc -static-libstdc++ -mwindows set CPPFLAGSR=-I"C:\local\wxWidgets-3.0.2\include" -I"C:\local\wxWidgets-3.0.2\lib\gcc_lib\mswu" -fno-keep-inline-dllexport -std=gnu++11 -static-libgcc -static-libstdc++ -mwindows set WINWXLIBSD=-Wl,--start-group -lwxbase30ud -lwxbase30ud_xml -lwxbase30ud_net -lwxexpatd -lwxjpegd -lwxmsw30ud_adv -lwxmsw30ud_core -lwxmsw30ud_html -lwxmsw30ud_media -lwxmsw30ud_webview -lwxmsw30ud_xrc -lwxpngd -lwxregexud -lwxscintillad -lwxtiffd -lwxzlibd -lwxmsw30ud_aui -lwxmsw30ud_ribbon -lwxmsw30ud_propgrid -lwxmsw30ud_richtext -lwxmsw30ud_stc -lwxmsw30ud_gl -Wl,--end-group set WXLIBFLAGSD=-mwindows -static-libgcc -static-libstdc++ %WINWXLIBSD% %WINLIBS% set WINWXLIBSR=-Wl,--start-group -lwxbase30u -lwxbase30u_net -lwxbase30u_xml -lwxexpat -lwxjpeg -lwxmsw30u_adv -lwxmsw30u_aui -lwxmsw30u_core -lwxmsw30u_gl -lwxmsw30u_html -lwxmsw30u_media -lwxmsw30u_propgrid -lwxmsw30u_ribbon -lwxmsw30u_richtext -lwxmsw30u_stc -lwxmsw30u_webview -lwxmsw30u_xrc -lwxpng -lwxregexu -lwxscintilla -lwxtiff -lwxzlib -Wl,--end-group set WXLIBFLAGSR=-mwindows -static-libgcc -static-libstdc++ %WINWXLIBSR% %WINLIBS% start eclipse.exe |
プロジェクトの設定でCPPFLAGSとWXLIBFLAGSを変えてDやRをつける。デバッグはD、リリースはR
デバッグしてみるとデバッガのステップがおかしい、-O2でビルドされているかもしれないがスルー