关于wxWidgets的优越已经在它的官方网站有所阐述,本文不再赘述。 本系列主要记录学习这个软件包过程中遇到的问题以及心得。

1.  安装

从源码安装虽然大多时候不是一件轻松的过程,但是基于以下两个优点作者选择从源码安装。(顺便提一句如果是Linux的新手,首要的选择还是看看正在使用的发行版本所提供的package管理工具,诸如apt 、yast等)

  • 在解决各种依赖关系的时候能够认识不少接受程度比较高的库
  • 好奇的时候可以潜入到源码中去看看究竟。

1.1 下载源码

源码下载地址,点这里。我选择的版本是2.8.12,大概18M左右的样子。

1.2 编译安装

解压以后,在wxWidgets-2.8.12的目录下名如 readme-<plat_form>.txt 以及 install-<plat_form>.txt的文件需要大概浏览一下。其中阐述了在各种平台下安装需要做的步骤。wxWidgets官方声称支持目前为止的所有desktop的GUI环境,在这里的确可以看到针对ms windows、x11、max、motif、gtk等都有所支持。

作者所使用的环境为Ubuntu 13.04 + gnome,因此选择gtk包。 尽管安装过程在install-gtk.txt叙述已经很完备,但还是在这里记录一下我的编译过程吧:

  • mkdir build_gtk;创建一个新的目录用于存放编译产生的object文件,以及库文件。不这样做得话其实也行得通,只是当前目录会被编译产生的中间文件占据,影响阅读。
  • cd build_gtk; ../configure --with-gtk --prefix=/usr
  • make ;编译过程不算很长,大概10+分钟的样子
  • sudo make install;注意,我在configure的时候所使用的prefix是‘/usr’,这样做得目的是:安装以后的头文件以及库文件分别在'/usr/include'以及'/usr/lib'下。以后在使用的时候不用再配置编译器、连接器(这是懒省事的做法)。需要注意的是,实际的安装路径使用了版本号,所以为了在程序中形如“#incude <wx/window.h>"能够奏效,最好手工在‘/usr/include'目录下加一个链接'wx'指向‘/usr/include/wx-2.8/wx'。configure默认的安装前缀(即 --prefix选项)是/usr/local,这样安装以后的头文件以及库文件会在'/usr/local/include'以及'/usr/local/lib'下。这样有助于将系统使用的库和用户使用的库分离,但是使用这些库进行开发的时候需要对编译器进行额外的配置。

作者到此为止RP还不错,在进行编译、安装的过程中没有遇到什么问题(^_^),读者如果遇到问题欢迎留言讨论。不过,需要注意的是,在configure的这一步,留意一下最后的结果,如果最后编译出问题的话大部分情况在编译结果里都会留下一点线索。

注意下面结果中的几个'no', 尤其是11行以后那些。它们表明了我以后如果使用这个安装进行数据库或者游戏开发的时候要遇到问题。(odbc,看起来是一个数据库的接口,sdl在编译各种游戏、多媒体的时候常见一些,至于libmspack是什么在google之前我也不知道。)

  1. Configured wxWidgets 2.8. for `x86_64-unknown-linux-gnu'
  2.  
  3. Which GUI toolkit should wxWidgets use? GTK+
  4. Should wxWidgets be compiled into single library? no
  5. Should wxWidgets be compiled in debug mode? no
  6. Should wxWidgets be linked as a shared library? yes
  7. Should wxWidgets be compiled in Unicode mode? no
  8. What level of wxWidgets compatibility should be enabled?
  9. wxWidgets 2.4 no
  10. wxWidgets 2.6 yes
  11. Which libraries should wxWidgets use?
  12. jpeg sys
  13. png sys
  14. regex sys
  15. tiff builtin
  16. zlib sys
  17. odbc no
  18. expat sys
  19. libmspack no
  20. sdl no

2. Hello world 程序

如同V形手虽然俗气但仍然频发现于各个层次的照片中一样,“hello world”虽然毫无新意但仍然不失作为一个demo的合理性。以下的程序来源于wxWidget官网,点这里进行阅读。作者在编译过程中进行了小部分修改(下文假设这段程序被保存为helloWorld.cpp)。

  1. #include <wx/wxprec.h>
  2.  
  3. #ifndef WX_PRECOMP
  4. #include <wx/wx.h>
  5. #endif
  6.  
  7. class MyApp: public wxApp
  8. {
  9. public:
  10. virtual bool OnInit();
  11. };
  12.  
  13. class MyFrame: public wxFrame
  14. {
  15. public:
  16. MyFrame( const wxString& title, const wxPoint& pos,
  17. const wxSize& size );
  18. private:
  19. void OnHello( wxCommandEvent& event );
  20. void OnExit( wxCommandEvent& event );
  21. void OnAbout( wxCommandEvent& event );
  22.  
  23. DECLARE_EVENT_TABLE( );
  24. };
  25.  
  26. enum
  27. {
  28. ID_Hello =
  29. };
  30.  
  31. BEGIN_EVENT_TABLE( MyFrame, wxFrame )
  32. EVT_MENU( ID_Hello, MyFrame::OnHello )
  33. EVT_MENU( wxID_EXIT, MyFrame::OnExit )
  34. EVT_MENU( wxID_ABOUT, MyFrame::OnAbout )
  35. END_EVENT_TABLE()
  36.  
  37. IMPLEMENT_APP( MyApp )
  38.  
  39. bool MyApp::OnInit()
  40. {
  41. MyFrame *frame = new MyFrame("Hello World", wxPoint( , ), wxSize( , ) );
  42. frame->Show( true );
  43. return true;
  44. }
  45.  
  46. MyFrame::MyFrame( const wxString& title, const wxPoint& pos, const wxSize& size)
  47. : wxFrame( NULL, wxID_ANY, title, pos, size )
  48. {
  49. wxMenu *menuFile = new wxMenu;
  50. menuFile->Append( ID_Hello, "&Hello...\tCtrl-H",
  51. "Help string shown in status bar for this menu item");
  52. menuFile->AppendSeparator( );
  53. menuFile->Append( wxID_EXIT );
  54.  
  55. wxMenu *menuHelp = new wxMenu;
  56. menuHelp->Append( wxID_ABOUT);
  57.  
  58. wxMenuBar *menuBar = new wxMenuBar;
  59. menuBar->Append( menuFile, "&File" );
  60. menuBar->Append( menuHelp, "&Help" );
  61.  
  62. SetMenuBar( menuBar );
  63.  
  64. CreateStatusBar( );
  65. SetStatusText( "Welcome to wxWidgets!" );
  66.  
  67. }
  68.  
  69. void MyFrame::OnExit( wxCommandEvent & event )
  70. {
  71. close( true );
  72. }
  73.  
  74. void MyFrame::OnAbout( wxCommandEvent& event )
  75. {
  76. wxMessageBox(" Ths is a wxWidgets' Hello world sample",
  77. "About Hello World", wxOK|wxICON_INFORMATION );
  78. }
  79.  
  80. void MyFrame::OnHello( wxCommandEvent& event )
  81. {
  82. wxLogMessage( "Hello world from wxWidgets!" );
  83. }

2.1 编译

客观地说,这一个程序其实不太适合作为wxWidgets的见面礼,它比想象中复杂一些,毕竟经典的hello world连与编译指令算到一起也不过5行。(果然,不出所料)编译的时候遇到了一些问题。

作者在实践这个程序之前没有一点使用wxWidgets的经验,所以就先进行了简单粗暴的尝试:gcc helloWorld.cpp 然后就是第一个error找不到setup.h, 确实在/usr/inlcude/wx中并没有这个文件的踪迹。这时候真正的问题是编译方法不对,wxWidgets为了跨平台需要对编译器选项(-I -L)进行一些设置。并且它提供了一个看起来还算比较优雅的解决方案——wx-config。wx-config可以查询当前平台的信息,并且返回编译器所需要的选项(下面的代码给出了wx-config这个工具的帮助信息,以及我们需要的编译选项),我们这里需要的是 --cxxflags。其实这里我们需要的是‘--cppflags’,但是如果不加‘--libs’的话,就会遇到第二个error:wxApp声明(具体是说第一个“{",也就是在上面代码的第8行之前需要一个什么乱七八糟的东西)。正确的编译指令是“ g++ helloWorld.cpp `wx-config  --cxxflags --libs` ”。(Linux新手请留意:wx-config左上边、lib右上边的那俩货不是单引号,而是获取程序标准输出的操作符,对一般的键盘而言在数字键1的左边,即这个符号“~”不加shift)。

  1. %>build_gtk$ wx-config
  2.  
  3. wx-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--release] [--version-full]
  4. [--list] [--selected-config] [--host=HOST] [--toolkit=TOOLKIT]
  5. [--universal[=yes|no]] [--unicode[=yes|no]] [--debug[=yes|no]]
  6. [--static[=yes|no]] [--version[=VERSION]] [--basename] [--cc]
  7. [--cppflags] [--cflags] [--cxxflags] [--rescomp] [--libs] [--cxx]
  8. [--ld] [--linkdeps] [--utility=UTIL] [LIB ...]
  9.  
  10. wx-config returns information about the wxWidgets libraries available on
  11. your system. It may be used to retrieve the information required to build
  12. applications using these libraries using --cppflags, --cflags, --cxxflags
  13. and --libs options. And you may query the properties of this configuration
  14. using --query-{host,toolkit,widgetset,chartype,debugtype,version,linkage}.
  15.  
  16. If multiple builds of wxWidgets are available, you can use the options
  17. --prefix, --host, --toolkit, --unicode, --debug, --static, --universal and
  18. --version to select from them. The --selected-config option shows the name
  19. of the current configuration and --list shows available alternatives which
  20. match specified criteria. The --utility option returns the correct version
  21. of UTIL to use with the selected build. The --linkdeps option returns only
  22. static libraries for your makefile link rule dependencies.
  23.  
  24. Optional LIB arguments (comma or space separated) may be used to specify
  25. the wxWidgets libraries that you wish to use. The magic "std" label may
  26. be used to import all libraries that would be used by default if none were
  27. specified explicitly, e.g. wx-config --libs core,base.
  28.  
  29. %> wx-config --cxxflags --libs
  30. -I/usr/lib/wx/include/gtk2-ansi-release-2.8 -I/usr/include/wx-2.8 -D_FILE_OFFSET_BITS= -D_LARGE_FILES -D__WXGTK__ -pthread
  31. -pthread -lwx_gtk2_richtext-2.8 -lwx_gtk2_aui-2.8 -lwx_gtk2_xrc-2.8 -lwx_gtk2_qa-2.8 -lwx_gtk2_html-2.8 -lwx_gtk2_adv-2.8 -lwx_gtk2_core-2.8 -lwx_base_xml-2.8 -lwx_base_net-2.8 -lwx_base-2.8

作者遇到的第三个error可能跟版本有关,官网给出的这个helloWorld程序我在对着敲了一遍以后(居然用尽了今天的RP),是无法编译通过的。具体的第三个error是几个事件有关的宏定义上。具体在23、31、35、37行,原文给出的几个宏都是以wx开头的,在2.8版本中去掉这些wx的开头就对了。有可能在源码中搜索一下或者去manual里面搜索一下就可以很快地找到答案。但是作者在排除这个问题的时候竟费了一些周折-_-!)

2.2 运行结果

如下所示,很简陋。不过看在几个菜单都能正常运行的份上,花两三个小时也不是很懊恼。

3. 参考资料

【1】www.wxwidgets.org


作者通信地址:Boyue.K.Cheung@outlook.com

欢迎交流、指错、提出改进建议。Please feel free to raise any questions, advices. I'll feel free to ignore them if necessary. ~_~


[wxWidgets] 1. 安装及"hello world"程序的更多相关文章

  1. wxWidgets的安装编译、相关配置、问题分析处理

    wxWidgets的安装编译.相关配置.问题分析处理 一.介绍部分 (win7 下的 GUI 效果图见 本篇文章的最后部分截图2张) wxWidgets是一个开源的跨平台的C++构架库(framewo ...

  2. 他山之石——vs2013 安装与部署及程序打包

    C#打包需要这个:InstallShield 2013 Limited Edition for Visual Studio  .下载地址: InstallShield 2013 Limited Edi ...

  3. inno安装卸载时检测程序是否正在运行卸载完成后自动打开网页-代码无效

    inno安装卸载时检测程序是否正在运行卸载完成后自动打开网页-代码无效 inno setup 安装卸载时检测程序是佛正在运行卸载完成后自动打开网页-代码无效 --------------------- ...

  4. Inno Setup入门(十一)——完成安装后执行某些程序

    Inno Setup入门(十一)——完成安装后执行某些程序 2011-02-16 16:24:23|  分类: Inno Setup |  标签:inno  setup   |举报 |字号 订阅   ...

  5. Inno Setup 安装前卸载原程序

    Inno Setup 安装前卸载原程序 分类: Install Setup 2013-02-02 15:53 2315人阅读 评论(0) 收藏 举报 很多時候我們需要在安裝文件之前卸載原有的程序而不是 ...

  6. SQLServer 安装以前的某个程序安装已在安装计算机上创建挂起的文件操作 解决办法

    http://wenku.baidu.com/view/6732fe09844769eae009ede2.html SQL Server 安装以前的某个程序安装已在安装计算机上创建挂起的文件操作 安装 ...

  7. Android利用广播监听设备安装和卸载应用程序

    MainActivity如下: package cn.testappaddandremove; import android.os.Bundle; import android.app.Activit ...

  8. 安装psacct或acct程序包

    监视Linux用户活动 我认为,对每个想密切监视其服务器/系统上用户活动的Linux/Unix系统管理员来说,psacct或acct是优秀的.必需的应用程序之一. psacct或acct程序包提供了用 ...

  9. C#创建安装、卸载部署程序

    分享3: 需求:对已经开发的应用程序进行安装封装操作,即创建安装.卸载部署程序: 分析:程序的开发是为了在不同的人在不同的机器上使用,为了使不同机器使用该软件就需要见程序安装包,并且保证安装包中必须包 ...

随机推荐

  1. 用javascript简单封装AJAX

    1.创建一个AJAX引擎对象 var CreateAjax = function () { var xhr = null; if (window.XMLHttpRequest) { //非IE游览器 ...

  2. 开源一个silverlight上的文本编辑器:SlEditor

    控件设置三个状态:编辑.设计.查看. 控件的内容可以打包保存为zip格式,内容可以包含图片等元素(解决了silverlight RichTextBox控件xaml属性无法获取InlineUIConta ...

  3. PHPstorm--ThinkStorm安装

    原文地址 http://www.thinkphp.cn/topic/34518.html​ QQ群: 320655679: 因为公司在使用Ide,来帮助开发,PHPstorm最近很流行,因为他有很多插 ...

  4. Android 终于官方支持按百分比来设置控件的宽高了

    dependencies { compile 'com.android.support:percent:22.2.0' } 支持布局 PercentRelativeLayout <android ...

  5. js中遍历出查询后的listmodel(下拉框系列)

    function selectclassname(){ $.ajax({ url:"queryschoolclasslists.action", async:false, data ...

  6. NYOJY 491 幸运三角形

    描述 话说有这么一个图形,只有两种符号组成(‘+’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置的金字塔形状,除第一层外(第一层为所有可能情况),每层形状都由上层决定,相邻的符号相同 ...

  7. PHP 记录日志

    public function writelog($message) { $logFileDir = LOG_PATH; $logFile = 'monitor' . date('Y-m-d') . ...

  8. ASP.NET 学习记录之一

    (放着期末考试不复习,我每天废寝忘食地阅读从图书馆借来的ASP.NET相关专业书籍,到现在快一个星期,终于掌握了点东西,但是一拿到真刀真枪就做不出来什么了:老师把实验室打开,我就在这码码代码咯) As ...

  9. (转) Xcode 7 Bitcode

    Xcode 7 Bitcode的工作流程及安全性评估 2015-12-18 06:13 编辑: suiling 分类:iOS开发 来源:FreeBuf黑客与极客 简介 随着 Xcode 7 的发布,苹 ...

  10. MTP in Android详解

    MTP in Android详解 最近好长一段时间没有做笔记了,今天主要学习一下MTP相关的知识. MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套 ...