Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1204902
  • 博文数量: 252
  • 博客积分: 5421
  • 博客等级: 大校
  • 技术积分: 2418
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-17 12:59
文章分类

全部博文(252)

文章存档

2017年(3)

2016年(18)

2015年(31)

2014年(18)

2013年(7)

2012年(8)

2011年(12)

2010年(30)

2009年(32)

2008年(57)

2007年(36)

分类: C/C++

2011-02-17 22:23:48

多数应用软件,通常需要一个界面与使用者进行交互。典型的交互方式可以分成三种:

  • 纯文字界面
    也称为“控制台”应用。此类应用通过以“一问一答”的形式在屏幕上打出提问的文字,然后等待用户输入后,程序得以继续运行。 这类交互形式称不上友好,但实现起来简单。在我们学习C++语法的一个很长的时期,我们所写的程序,多数采用此类形式。
  • 图形用户界面
    通过“对话框”、“菜单”、“按钮”等典型的图形元素所提供的用户界面。即“图形用户界面/Graphical user interface”,简称为GUI。该形式下,用户通过鼠标或键盘操作,选择所需的功能。 我们常用Office软件、QQ聊天软件、以及Windows操作系统本身,都是典型的GUI程序。
  • 浏览器界面
    浏览器界面是GUI的一种特定应用。它将程序分为后台服务和前台展示两部分。后台服务主要实现程序的业务逻辑,以及产生界面脚本(通常是HTML),真正 的界面展现与交互工作完全交给第三方的浏览器(比如IE,或Firefox)去完成。 当我们上网浏览新闻时,就是在使用此类应用。

本书前面的一大部分内容,采用“纯文字界面”作为范例程序主要采用界面方式。此安排自然是为了避免读者一开始就陷入复杂的GUI界面设计的“泥潭”之中。然而,与大多数纯粹的C++语言教程止步于此不同,如果编写(跨平台)的“图形用户界面”,也是本书的主要教学内容。

C++的GUI程序库,同样充满很多选择。一些非开源产品多数仅限于某一平台。wxWidgets 是同时符合“开源”、“成熟”、“跨平台”,并且支持各平台“原生界面”的GUI库中的佼佼者。这里的“原生界面”是指,在A系统下,其生成的界面元素, 就和A系统的本地界面风格一致,这里的A,可以指代Windows XP、也可以指代Linux下某一图形界面。

wxWidgets的主要特点如下:

  • 开源
  • 跨平台:Windows、Mac OS X、GTK+、X11、Motif、WinCE。
  • 既支持原生界面,也支持统一风格界面。
  • 不仅仅是图形界面库:集成提供了包括文件操作、目录操作、多线程、网络通讯、OpenGL(3D)等等功能库。
  • 支持不同的库链接形式:静态链接,动态链接库,其中后者还可以支持编译成单一动态库,或多个小动态库的形式。
  • 支持UNICODE:编译时,可以编译出UNICODE或非UNICODE两种版本,本书采用UNICODE,以方便编程上对汉字的操作。
  • 发展成熟:有较长的发展历史(起源于1992年),业界有许多基于wxWidgets的成熟应用
  • 学习资源丰富:网络上的可以找到较多的资源。
  • 与Code::Blocks结合紧密:C::B本身正是采用wxWidgets实现跨平台的图形用户界面。另外C::B内置了使用wxWidgets的可视界面设计工具。
  • 支持多种编译器:包括本书采用的开源gcc/g++编译器,也包括Visual C++等商业编译器。

本书配套光盘提供了wxWidgets 2.8.8 版本的安装程序,以及四种编译库。您可以通过查看光盘中对应的说明文件,实现快速安装。

如果您需要更新版本的wxWidgets,或者您只是想学习其编译过程,那么请继续阅读下述内容。

2.4.1. 准备

请通过本小节末尾的“相关网站”链接,上网下载wxWidgets的最新稳定版本。请注意选择为for windows版本。

下载得到的,应是一个可执行的安装程序。与Code::Blocks的安装类似,建议将其安装某个驱动器的根目录下,比如:E:\ wxWidgets-2.8.8 目录下(尾部数字以您所使用的wxWidgets版本为准)。

当然,由于本书将指导您安装多个C++扩展库,因此,如果您愿意建立一个新文件夹,用于作为各个C++扩展库的统一的父文件夹,的确是个好主意。

2.4.2. 编译

上一步安装wxWidgets,仅得到源代码文件及一些说明。我们还需要将其中的源代码编译成“库”文件。此类“库”有很多种形式,但其实都可以称为“预编译库”。意思是:它们已经编译好了,你直接拿去用吧。

我们先简单地了解一下“动态、静态”及“调试、发行”的区别。

“库”通常包含很多功能代码,但它们本身并不能直接运行,而是准备提供给应用程序使用, “动态链接”和“静态链接”代表程序如何找到及使用库功能的两种不同方法。

“静态链接”是指,直接将库文件和程序文件合成一个大文件,在合并过程中,完成对库文件各个功能的定位。这个事情发生程序编译的过程。

“动态链接”与此相反,库文件和程序文件各自独立存在,程序在运行时,才去库文件找相关的功能。

完全使用“静态链接”,我们可能会得到一个“胖胖”的程序,直接发给用户使用就可以了。使用“动态链接”,我们可能需要分发给你的用户多个文件(程序和各个库文件)。不小心弄丢了哪个文件,用户们就要抱怨你的软件“跑”不起来了。

“调试版”和“发行版”就和链接技术无关了。前者表示,二者的区别在于:前者含有调试信息,而后者没有。有调试信息有利于我们纠出程序中的错误,不过既然它的含有额外的信息,所以这样的库肯定“胖”了不少。如果觉得错误纠得差不多了,我们就可以改用相对“苗条”的发行版。

有关“库”的详细知识,我们留在第四章讲。今天我们将把wxWidgets编译译成四种形式:

  • 动态链接库 + 调试版
  • 动态链接库 + 发行版
  • 静态链接库 + 调试版
  • 静态链接库 + 发行版

另外,wxWidgets的编译,还可以区分“UNICODE”及“非 UNICODE”两种式。在多数场合下,“UNICODE”可以对汉字及国际化有较方便的支持。因此以上四种组合,我们全部都加上相同“UNICODE” 选项。当然, “非UNICODE”选项倒也不是一无是处,以后我们也会用到。

正式开始编译之前,必须确保已经在电脑上正确安装好mingw32环境,如果您不在确信,请使用2.1.6.1小节中提及的方法进行检测。

(以下四个版本都需要编译,而不是仅编译其一。)

  • 静态链接(调试版)

步骤1:打开“开始”菜单:“所有程序→附件→记事本”程序。用它打开 wxWidgets安装目录下,子目录“build\msw\”下面的“config.gcc”文件。

步骤2:找到以下内容,并确保将等号(:=)后面的值如下面加粗内容所示。另外其它未指部分的内容,请保持不变。

步骤3:请确认保存了本步的修改成果,再继续下一步。

# What type of library to build? [0,1]
SHARED := 0

# Compile Unicode build of wxWidgets? [0,1]
UNICODE := 1

# Type of compiled binaries [debug,release]
BUILD := debug

 

步骤4:SHARED 为 0表示要编译的是静态库,而不是动态库(共享库);

UNICODE为1,表示要编译成UNICODE版本,这一项在本次编译过程中始终为1。

BUILD为debug,表示要编译成含有调试信息的版本。

步骤5:打开“开始”菜单,选择“运行”,输入cmd,进入控制台窗口,然后在其内通过cd命令,切换到wxWidgets安装目录下的“build\msw”路径。比如您把wxWidgets 安装在“E:\wxWidgets-2.8.8”,则过程如下:

E: (回车)

cd wxWidgets-2.8.8 (回车)

cd build\msw (回车)

步骤6:在第3步的控制台中,继续输入以下命令:

mingw32-make.exe -f makefile.gcc (回车)

步骤7:这将开始一段长约30分钟的编译过程(视你的机器配置而定)。

  • 静态链接(发行版)

编译过程和前一版本主要差别在于“config.gcc”文件的修改内容:

# What type of library to build? [0,1]
SHARED := 0

# Compile Unicode build of wxWidgets? [0,1]
UNICODE := 1

# Type of compiled binaries [debug,release]
BUILD := release

其它操作方法不变。

  • 动态链接(调试版)

编译过程和前一版本主要差别在于“config.gcc”文件的修改内容:

# What type of library to build? [0,1]
SHARED := 1

# Compile Unicode build of wxWidgets? [0,1]
UNICODE := 1

# Type of compiled binaries [debug,release]
BUILD := debug

其它操作方法不变。

  • 动态链接(发行版)

编译过程和前一版本主要差别在于“config.gcc”文件的修改内容:


# What type of library to build? [0,1]
SHARED := 1

# Compile Unicode build of wxWidgets? [0,1]
UNICODE := 1

# Type of compiled binaries [debug,release]
BUILD := release

其它操作方法不变。

2.4.3. 结束

这是一次漫长的编译过程,至此,我们完成了四个版本的wxWidgets库的编译。它是我们编写图形用户界面基础。

为了确保大家尽量顺利地完成编译,我们在“config.gcc”仅选择了最基本的编译选项。因此 一些强大wxWidgets功能模块没有被编译成库,比如前面提到的非Unicode版,另外没有支持OpenGL、OBDC等功能。后面需要时,我们将 会加上,并且令大家放心的是,这并不会带来又一次wxWidgets漫长完全编译。

〖小提示〗:程序员,起来走走……

每次30分钟的编译过程,漫长的等待中,我猜到您不耐烦得站起来四处走动。走动其实健康有益。然而,在程序员的生涯中,我们更多面临的,可能是无数个3分钟,甚至是30秒的等待,这时,你是否记得提醒自己也要常常起来走动走动?

Code::Blocks专门提供一个插件,用于提醒程序员注意休息,很有兴趣?请在休息之后继续我们的白话之旅。

编译过程中会产生大量的中间临时文件。请进入wxWidgets文件夹内的“build”子文件 夹,搜索 “*.o”文件(确保选中“搜索子文件夹”选项):约有3千多个中间文件,全部删除,可以腾出1G多的空间。(Windows下多数编译器会生产扩展名为 “.obj”的文件,但mingw32-g++产生的为“.o”文件。)

编译完成后,所有静态链接库位于wxWidgets安装目录下的“lib\gcc_lib”子目录。而动态链接库位于 “lib\gcc_dll”子目录。

仔细观察,会发现库文件名称中,有不少带有“ud”字母的文件,其中‘d’表示“debug”,即调试版本 ,不带‘d’的通常是“release”版本。

‘u’表示“Unicode”,即支持Unicode编码。虽然我们这一次编译的全部采用“Unicode”选项,但还是存在一些文件并不带‘u’字母,那是因为这些库并不涉及到字符串的国际化处理,所以不需要考虑编码,比如与Jpeg图形功能有关的库。

  • 静态库文件

libwxbase28u.a
libwxbase28ud.a   libwxbase28ud_net.a   libwxbase28ud_xml.a
libwxbase28u_net.a   libwxbase28u_xml.a   libwxexpat.a
libwxexpatd.a     libwxjpeg.a    libwxjpegd.a
libwxmsw28ud_adv.a   libwxmsw28ud_aui.a   libwxmsw28ud_core.a
libwxmsw28ud_html.a   libwxmsw28ud_media.a   libwxmsw28ud_richtext.a
libwxmsw28ud_xrc.a   libwxmsw28u_adv.a   libwxmsw28u_aui.a
libwxmsw28u_core.a   libwxmsw28u_html.a   libwxmsw28u_media.a
libwxmsw28u_richtext.a  libwxmsw28u_xrc.a   libwxpng.a
libwxpngd.a    libwxregexu.a    libwxregexud.a
libwxtiff.a    libwxtiffd.a    libwxzlib.a
libwxzlibd.a

  • 动态库文件

wxbase28ud_gcc_custom.dll     wxbase28ud_net_gcc_custom.dll
wxbase28ud_xml_gcc_custom.dll   wxbase28u_gcc_custom.dll
wxbase28u_net_gcc_custom.dll    wxbase28u_xml_gcc_custom.dll
wxmsw28ud_adv_gcc_custom.dll   wxmsw28ud_aui_gcc_custom.dll
wxmsw28ud_core_gcc_custom.dll   wxmsw28ud_html_gcc_custom.dll
wxmsw28ud_media_gcc_custom.dll    wxmsw28ud_richtext_gcc_custom.dll
wxmsw28ud_xrc_gcc_custom.dll    wxmsw28u_adv_gcc_custom.dll
wxmsw28u_aui_gcc_custom.dll     wxmsw28u_core_gcc_custom.dll
wxmsw28u_html_gcc_custom.dll    wxmsw28u_media_gcc_custom.dll
wxmsw28u_richtext_gcc_custom.dll  wxmsw28u_xrc_gcc_custom.dll

在gcc_dll目录下,除了扩展名为“.dll”的动态链接库以外,还存在大量的扩展为“.a”的文件,称为“导入库/Import library”,为了节省篇幅,上表未加列出。

“导入库”在编译时向应用程序提供信息,以辅助应用程序在运行时,定位具体某一功能在DLL文件中的入口。也就是说,今后编译程序时,将用到它们,但它们不必随同程序一起发行。

2.4.4. 相关网址

wxWidgets 官方网站:

wxWidgets扩展代码:

阅读(3598) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-06 15:58:56

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com