wxWidgets是一个跨平台的C++的GUI开发库,用来开发桌面应用程序的,具体就不加介绍了,详情的话可以看看官网的Wiki或是使用搜索引擎搜索相关介绍。这次主要讲讲,我第一次使用这个开发库遇见的问题,和一些简单的解决方法,特别是如何使用eclipse的IDE环境(注:如果不是硬性要装elipse,相信其他IDE比较适合,比如Code::BlocksCodelite)。

为什么要用wxWidgets呢,这个原因,主要是自己学了C++无从使用有点不甘心,而且大学将近过了一大半了,现在连个简单的桌面应用程序都写不出,出去都不好意思说我是软工专业毕业的了 (/‵Д′)/~ ╧╧

在使用wxWidgets之前,还是先要安装这个开发库,这其中,有两个名词注意一下,一个是静态链接库以及动态链接库,这其中的区别,可以简单理解为,运行时,经动态链接库编译的也需要这个动态链接库,而静态的不需要,运行可执行文件即可(这里,我可能解释得不是很准确,给个比较好的介绍链接1)。说了那么多,那么就开始编译安装wxWidgets了,在这里,我就不提供安装包或者包管理安装了,因为这些官网都有简单的介绍2,主要还是讲一讲比较“折磨”的源代码安装。

我主要还是讲讲Ubuntu下的安装方式,Ubuntu就比较简单了,其实就三句命令,分别是配置编译安装,当然规范的源代码安装也是这样的,学好这个固然理解整个源代码安装的规范流程。

首先是配置,这里官网有提供简单的配置参数3

# 首先,解压从官网上下载的源代码,并在其目录下建立一个用来存放编译文件的目录
$ cd /path/to/wxWidgets
$ mkdir gtk-build
# 我在这个建立一个gtk-build的目录用来存放之后编译后的文件
$ cd gtk-build
$ ../Configure --enable-unicode --enable-monolithic --enable-debug

在这里,我简单介绍一下,一些配置信息,默认情况下,是生成动态链接库,可以使用参数--disable-shared取消,而生成单文件的参数--enable-monolithic只能在动态链接库的选项下执行,而--enable-debug是可以使用Debug的方式编译运行,而默认的安装目录实在/usr/local/下,修改参数--prefix=/your/installation/path即可,具体的其他参数,可参考--help或者官网。至于windows下的编译,我就提供一个链接4供大家参考(其实刚才那个官网提供的参数配置3里也有介绍到windows的编译方式)

接下来,就是编译了,做好上一步的话,编译就不是很难了,只需要在刚才那个gtk-build目录下执行一句命令$ make就可以了。对了,上一步配置检查的过程中会有缺少gtk依赖项的小错误,解决方式5sudo apt-get install libgtk2.0-dev

安装,如果没有更改安装目录的话,安装至/usr/local/目录下,可能有权限问题,所以要在gtk-build执行sudo make install;如果是安装在非权限目录下,执行make install就可以了,但是这样会带来环境配置的问题,最好还是装在/usr/local,方便管理。

最后,就是如何在eclipse上使用该开发库了,自然,我是已经安装好了eclipse,至于如何在Ubuntu下安装elipse,就已经偏题了。先提供官网的配置方法,当然也是最正确的配置方式。

有人会问,eclipse编C程序是个坑,但是,我因为一些原因,要用到eclipse,且已经安装完CDT了,为什么不用呢,还要多下个软件,徒增内存(以上纯属个人意见,当然如果是为了更大的项目的话,在eclipse上编C的确不是很好的选择,但我们是学习嘛,就不用考虑那么多了嘛)。

打开eclipse,先建立一个C++项目(File->New->C++ Project),然后之后在这个项目上右键选择Properties,在C/C++ Build -> Setting设置里,有以下几个地方要设置。

一、 C++编译设置里,在Miscellaneous->Others flags后添加(`wx-config –cxxflags`),不要忘了(`)这个符号。

GCC C++ Compiler Setting

二、 C编译设置里,同理,加上(`wx-config –cflags`)。

GCC C Compiler Setting

三、 在C++的链接器设置中,在Linker flags中添加(`wx-config –libs`)

GCC C++ Linker Setting

四、 将其Command Line Pattern中改为

${COMMAND} ${OUTPUT_FLAG} ${OUTPUT_PREFIX} ${OUTPUT} ${INPUTS} ${FLAGS}

GCC C++ Linker Setting

之后,建立一个main.cpp写入代码测试一下,发现缺少libwx_gtk2u-3.0.so文件,原来在运行的时候,系统没有添加/usr/local/lib下的运行库文件,所以在elipse的运行设置中添加这样一段即可。

Run Configurations

还有就是在编程的时候,没有自动填充,这是很头疼的事,eclipse提供了一个功能能够倒入头文件来建立自动填充的提示,虽然要另外安Alt + /实现,但也是足够了。具体还是看这个解决方案6(如下图设置)。

Paths and Symbols

至于测试代码,我这里附上官网的hello源码

// 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!");
}

另外,可能有一些朋友是使用windows的eclipse,在这里,附上另外一个人写的教程做参考