wxWidgetsの使い方 その2 MingWとEclipseCDT

投稿者: | 2016/12/4 日曜日

連載

その1
その2
その3

環境

Windows 8 32bit

MingWのインストール

公式からインストール、ここではC:\local\MinGWにインストール。パッケージは以下
clipshot-2016-12-03-00-01-05

wxWidgetsのビルド

公式からwxWidgets-3.0.2.7zをダウンロードして、C:\local\wxWidgets-3.0.2に展開。

C:\local\MinGW\msys\1.0\msys.batを実行しmsysを開く。

Debugでビルドする。

$ 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を作成。

set PATH=C:\local\MinGW\bin;C:\local\MinGW\msys\1.0\bin;%PATH%
start eclipse.exe

start.batから起動し、C++プロジェクトを作成
clipshot-2016-12-03-00-23-24

C++ソースhello.cppを追加し以下のように作成。

#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を以下のように書き換える。

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を指定している。このフラグはライブラリの循環参照をしてくれるため記述の順番を考慮しなくていい。しかし遅くなるとのことなのでいったんビルドが成功したら外したほうがいいがその時リンクエラーになるかもしれない。

ここで作成したCPPFLAGSWXLIBFLAGSをプロジェクトの設定で追加する。
clipshot-2016-12-03-18-54-56

clipshot-2016-12-03-18-56-38

ビルドして実行

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)

clipshot-2016-12-03-19-30-20

リリースバージョンも含めてちゃんとつくる

wxWidgetsのビルド

$ mingw32-make.exe -f makefile.gcc BUILD=release UNICODE=1 SHARED=0 MONOLITHIC=0 CXXFLAGS="-fno-keep-inline-dllexport -std=gnu++11"

start.bat編集

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でビルドされているかもしれないがスルー

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です