在 Xcode 8 中创建 wxWidgets 的工程

wxWidgets 的文档太老了,相应的指引根本无法使用。经过一番摸索,终于找到了在 Xcode 中创建 wxWidgets 的工程。

前提条件

Homebrew

1
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

wxWidgets

1
$ brew install wxwidgets

开始创建工程

  1. 打开 Xcode -> “Create a new Xcode project”
    Create a new Xcode project

    注意要选择 “Cocoa Application”。我一开始选了 “Command Line Tool” ,虽然也能正常跑出来界面,但生成的只是一个可执行文件,而不是 Application Bundle 。这样一来就无法定制程序的图标和一些其它的行为。

  2. 语言选 Objective C ,其它的勾全部清空。
    Set up project

  1. Build Settings -> Other Linker Flags

    打开 Terminal 输入

    1
    wx-config --libs

    将输出的内容添加到:
    Other Linker Flags

  2. Build Settings -> Other C++ Flags

    打开 Terminal 输入

    1
    wx-config --cxxflags

    将输出的内容添加到 “Ohter C++ Flags”

  3. 把没用的文件删除:
    Delete useless files
    其中 Assets.xcassets 是用来放图标的,要留着。MainMenu.xib 是程序菜单,不需要可以删除掉。

  4. wxWidgets 的 Hello world 测试一下。
    new file
    新建一个 main.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
    63
    64
    65
    66
    67
    // wxWidgets "Hello world" Program
    // For compilers that support precompilation, includes "wx/wx.h".
    #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(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( "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, "&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!" );
    }
    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!");
    }

    7, 点击运行,一切 OK 就可以开始愉快地编程了。