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

1.下载&安装

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

wxWidgets官方主页为:www.wxWidgets.org。 稳定版本程序所在的下载页面为: http://www.wxwidgets.org/downloads/#latest_stable。

请找到“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编译环境准备好了吗?通常,如果您已经严格按照本站课程《C++集成设计环境——Code::Blocks安装》进行安装了的话,那么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 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

 

下一步,我们就可以开始在Code::Blocks中通过这里编译出来的成果,编写GUI程序了,欲知Code::Blocks如何与wxWidgets擦出火花来,且听下回分解!

你可能感兴趣的:(C++,windows,gcc,Build,library,跨平台)