在Ubuntu上编译使用wxWidgests
wxWidgets是一个跨平台的C++的GUI开发库,用来开发桌面应用程序的,具体就不加介绍了,详情的话可以看看官网的Wiki或是使用搜索引擎搜索相关介绍。这次主要讲讲,我第一次使用这个开发库遇见的问题,和一些简单的解决方法,特别是如何使用eclipse的IDE环境(注:如果不是硬性要装elipse,相信其他IDE比较适合,比如Code::Blocks或Codelite)。
为什么要用wxWidgets呢,这个原因,主要是自己学了C++无从使用有点不甘心,而且大学将近过了一大半了,现在连个简单的桌面应用程序都写不出,出去都不好意思说我是软工专业毕业的了 (/‵Д′)/~ ╧╧
在使用wxWidgets之前,还是先要安装这个开发库,这其中,有两个名词注意一下,一个是静态链接库以及动态链接库,这其中的区别,可以简单理解为,运行时,经动态链接库编译的也需要这个动态链接库,而静态的不需要,运行可执行文件即可(这里,我可能解释得不是很准确,给个比较好的介绍链接1)。说了那么多,那么就开始编译安装wxWidgets了,在这里,我就不提供安装包或者包管理安装了,因为这些官网都有简单的介绍2,主要还是讲一讲比较“折磨”的源代码安装。
我主要还是讲讲Ubuntu下的安装方式,Ubuntu就比较简单了,其实就三句命令,分别是配置、编译、安装,当然规范的源代码安装也是这样的,学好这个固然理解整个源代码安装的规范流程。
# 首先,解压从官网上下载的源代码,并在其目录下建立一个用来存放编译文件的目录
$ 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
依赖项的小错误,解决方式5:sudo 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`),不要忘了(`)这个符号。
二、 C编译设置里,同理,加上(`wx-config –cflags`)。
三、 在C++的链接器设置中,在Linker flags中添加(`wx-config –libs`)
四、 将其Command Line Pattern中改为
${COMMAND} ${OUTPUT_FLAG} ${OUTPUT_PREFIX} ${OUTPUT} ${INPUTS} ${FLAGS}
之后,建立一个main.cpp
写入代码测试一下,发现缺少libwx_gtk2u-3.0.so
文件,原来在运行的时候,系统没有添加/usr/local/lib
下的运行库文件,所以在elipse的运行设置中添加这样一段即可。
还有就是在编程的时候,没有自动填充,这是很头疼的事,eclipse提供了一个功能能够倒入头文件来建立自动填充的提示,虽然要另外安Alt + /
实现,但也是足够了。具体还是看这个解决方案6(如下图设置)。
至于测试代码,我这里附上官网的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,在这里,附上另外一个人写的教程做参考