领先的中文IT技术网站    IT技术从现在起飞

飞诺旗下: 技术社区 | 在线电子书 | 在线试题 | 资源下载 | 飞诺搜索 | 技术博客
用户名: 密   码:
   飞诺网 加入收藏
飞诺网 C++ 新闻频道 开发频道 系统频道 服务器 网络频道 网络安全 Java频道 C/C++ PHP开发 电子书 资源下载 社 区 博 客 在线试题
软件编程 C C++ Java VB Delphi Foxpro 汇编语言 游戏开发 移动开发 软件工程师 软工与管理 VC shell编程 C#
编程开发 JAVA C/C++ C++ VC C语言 VB C# Delphi Foxpro 汇编 shell编程 游戏开发 软件工程师 WEB开发 PHP ASP Asp.net JSP AJAX CGI JavaScript HTML CSS 数据库 MSSQL Mysql Oracle Access Sybase DB2 sql2005 Office Word Excel Powerpoint Wps 认证考试 二级C语言 三级网络 程序员 网络工程师 思科认证

您当前的位置:飞诺网 >> c/c++ >> C++实例教程

跨平台的C++ GUI库——wxWidgets编译

www.firnow.com    时间 : 2008-08-26  作者:佚名   编辑:本站 点击:   [ 评论 ]

1.下载&安装

本课程仅讲解在wxWidgets在Windows下的安装过程。

wxWidgets官方主页为:

请找到“wxMSW - installer for Windows, with manual”字样的链接,点击下载。为方便起见,本站也提供了直接链接:

下载得到的为一个执行程序,截止本文撰写日期(2008年08月11日),最新稳定版本为“2.8.8”。双击程序,即开始安装,为方便起见,本文假设您将其安装在“X:\wxWidgets-2.8.8”目录下。

安装完以后,在Windows的开始菜单的程序组中,可以找到对应的wxWidgets菜单。如果您安装有旧版本的wxWidgets,那么新旧版的菜单组很可能混成一组。

2.准备知识

请注意:所安装的文件,仅仅是wxWidgets的源代码(没错,wxWidgets是开源的),还有一些手册;我们还需要将其进行编译,才能得到wxWidgets在Windows可用的库。

2.1 动态库 vs. 静态库

从编译结果上看,C++库可以被编译成“静态”链接库,也可以被编译成“动态”链接库。所谓“链接库”的意思就是,库自身并不可以被执行。应用程序才是可执行的,为了写一个应用程序,可能需要用到很多功能,其中一些功能,应用程序的作者并不用自己实现,而是直接使用链接库即可。把应用程序与库在功能上进行合并的过程,就叫做过“链接”。如前所有述,有两种链接方法:静态或动态。

所谓“静态链接”,就是直接把库文件和可执行文件合二为一,形成一个文件。这种情况下,发布可执行文件时,就不必另外附加那个功能库了;因为事实上那个功能库已经“嵌入”在可执行文件中(可执行文件的体积,变大了)。静态链接方法,适用于功能简单应用程序。

所谓“动态链接”,是指程序在运行时,才会去寻找动态库中所需要的功能,然后在内存中加载入动态库。这种情况下,可执行文件与动态库独立存在,没有合成一体,在发布程序时,你必须两个文件一起安装到用户的电脑上。动态链接方法,适用于相对复杂的应程序,通常这种情况下,为了方便用户安装,我们会提供一个安装程序。 另外,在Linux系统中,“动态链接库”通常被称为“共享库”(文件扩展名也改为.so);这也说出了“动态链接”这项技术带来的另一个好处:多个应用程序可以共用一个独立的动态库。

如果把盖房子想像成写程序的话,当我们需要建造其中的自来水系统时,可以把水库当成是一种功能链接库。那么,当我们是在乡下自建一座独门独户的小楼,那么可以采用“静态链接”的方法,即在自家楼里砌个水库,自个儿使用,当然这个自建的水库往往增加了小楼的体积。来到城里,城里的一座高楼住着千家万户,这时,“动态链接”技术派上用上,所有住户共享一个水库,当你需要水时,打开水龙头,水就从外部“动态”而来。

为了方便以后使用,今天wxWidgets将我们编译成至少两个版本,即动态库和静态库,我们一个也不能少。

2.2 DEBUG vs. RELEASE

DEBUG 指“调试”版。表示编译出所库含有调试信息,这自然会让库变得很大,但有利于我们写程序时跟踪也发现错误。

RELEASE 指 “发行”版。表示我们认定程序写得差不多了(能解决的问题都解决了,错误相对比较少),这时调试信息就不需要了,库恢复它原来的大小。

为了方便调试与发而程序,DEBUG和RELEASE,同样的,我们一个也不能少。

2.3 UNICODE vs. 非 UNICODE

传统C++程序中,对普通的1个英文字符采用1个字节表示,而对1个汉字采用两个字节表示。比如有这样一句话:

“文件c:\abc\efg\我的文档\奥运知识ABC\乒乓球基础知识.txt无法打开!”

假设计数以0开始,那么例子中那句话,第0个字符是“文”字的前半个字符,第1个字符则是“文”字的后半个字符。事实上半个汉字是没意义的,它只会为字符串处理上带来困难。比如,假设我们要把上述那句话显示在显示在某个窗口上,但由于窗口太小,显示不下这时我们希望将那句话的截掉一点,结果类似:

“文件c:\abc\efg\我的文档\奥运知识ABC\乒乓球基...”

这个过程看似简单,但其实复杂,如果不进行特殊的处理,程序很要可能会在某个汉字的半个字符处截断那句话,而1个汉字一旦被“腰斩”了,剩下的那个半个汉字,无论是上半身还是下半身,就会在屏幕上显示乱码。

解决这个问题,方法有很多种,其中采用“UNICODE”是个相对通行而简单的办法,并且解决得比较彻底。“UNICODE”的方案说起来也简单,就是用两个字节甚至四个字节去表达一个字符(无论是英文字符还是中文、日语等)。

我们是中国人,经常要处理汉字。所以在本次编译过程,我们只选择UNICODE的方案。

2.4 不同编译器版本

C++的库,往往还要区分不同的编译器版本,它们之间往往是不通用的。比如同样一套源代码,用gcc编译出来的库,无法给准备用borland c++编译的程序使用。

我们采用gcc编译wxWidgets。 因为gcc是我们默认使用的编译器。

3. 编译

结合2.1、2.2、2.3小节,可以得出结论,今天我们要用gcc编译出4种版本的wxWidgets库:

  • UNICODE + DEBUG + 静态链接
  • UNICODE + RELEASE + 静态链接
  • UNICODE + DEBUG + 动态链接
  • UNICODE + RELEASE + 动态链接

通常,这将是一个漫长的过程,大家先去准备点茶水吧。

3.1 检查gcc编译

你的gcc编译环境准备好了吗?通常,如果您已经严格按照本站课程进行安装了的话,那么gcc应该正确地安家落户在您的windows系统中。不过我们还是来检查一下吧。

Windows“开始”菜单,选中“运行”,出现的对话框中输入cmd,确认,出现控制台窗口。在其中试着输入:mingw32-make.exe 然后回车,如果您看到的是“……不是内部命令,也不是可运行的程序……”,那就说明mingw32 版 gcc没有被安装正确。正确的情况应该是看到:“mingw32-make.exe: *** No targets specified and no makefile found. Stop.”。

检查通过,我们来依序编译前述四个版本。

3.1.1 编译 UNICODE + DEBUG + 静态链接库

  • step1 :打开“开始”菜单:“所有程序->附件->记事本”程序。用它打开 wxWidgets安装目录下,子目录“build\msw\”下面的“config.gcc”文件。
  • step2 :找到以下内容,并确保将等号(:=)后面的内容修改如下所示。可能有部分选项不用修改就已经是下面列出的值了。另外其它未指部分的内容,请保持不变。

# 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

 

字如其意,SHARED 为 0表示要编译的是静态库,而不是动态库(共享库);UNICODE为1,表示要编译成UNICODE版本,这一项在本次编译过程中始终为1。BUILD为debug,表示要编译成含有调试信息的版本。

有一位“巧媳妇”煮汤,拿勺捎了点试一口,不够咸,于是加盐,再试,仍不够,再加,再试,还不够;又加,又试,又不够……在修改完成后,请记得保存所修改的文件再进行以下步骤操作。

  • step 3: 打开“开始”菜单,选择“运行”,输入cmd,进入控制台窗口,然后在其内通过cd命令,切换到wxWidgets安装目录下的“build\msw” 路径。比如您把wxWidgets安装在“E:\wxWidgets-2.8.8”,则过程如下,其中(回车)表示让您输入回车键:

E: (回车)

cd wxWidgets-2.8.8 (回车)

cd build\msw (回车)

  • step 4:在第3步的控制台中,继续输入以下命令:

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

敲完回车键后,正确情况下,控制台窗口内就一阵狂忙,在我的机器上,大致忙了25分钟。

完成之后,用文件管理器打开wxWidgets安装目录下的“lib\gcc_lib”子目录,可以看到产生一堆新文件,有许多“*ud.a”的文件,或"*28ud_*.a"。其中u表示unicode,而d表示debug。当然,也有一些文件是不带u字的,那是因为有些库没有涉及到字符串的国际化处理,所以不需要考虑编码。

3.1.2 编译 UNICODE + RELEASE + 静态链接库

和前一小节类似,唯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

编译完成后,进入wxWidgets安装目录下的“lib\gcc_lib”子目录,可以看到又产生了一堆新文件,请大家自行对比它们经前一步所产生文件名的区别。

到这一步,静态版编译完成。在“lib\gcc_lib”子目录下生成以下成果文件:

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

3.1.3 编译 UNICODE + 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 := debug

编译完成后,这回需要进入wxWidgets安装目录下的“lib\gcc_dll”子目录下,这里存放在产出来的.dll文件,同时也有一些.a文件,但它们的体积明显较小,这些.a文件称为“导入库”,不能删除。如果把dll称为水库的话,那么“导入库”就当于是铺入到你家里的自来水管。

3.1.4 编译 UNICODE + 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 := release

至此,动态版也编译完成,在“lib\gcc_dll”子目录下,产生如下成果文件:

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
 1 2
如果图片或页面不能正常显示请点击这里
C++实例教程推荐文章

文章评论

BBS社区热贴