安装wxWidgets遭遇的两大关卡

早就想体验wxWidgets。这学期的C++课,课时还算充裕,关键是弟子们的实践能跟得上,我希望能让他们也浅尝一把GUI开发。MFC可以选,但既然IDE都用CodeBlocks了,还是选wxWidgets,开源平台到底吧。
  要引弟子行,师傅先走一步。
  最简单的办法,下载wxPack,直接安装。看到安装需要的空间相当大,有些犹豫,一是没有找到合适的下载源(我的浏览器打不开http://sourceforge.net,估计又是移动宽带不能解析域名,懒得找他们了),二也想体验利用下载的源文件,自己编译做些体验。
  下载了wxWidgets-3.0.0、wxWidgets-2.8.8,老机器编译时间长,还总出问题。几次编译,不是到下班时间,就是到要到开会时间,错在何处,没有静心去看。

  无端怀疑下载的版本有问题(这个心理很多时候是错的)。偏偏这方面的资料真的不多,能静下心来正视问题之时,下面的工作都是基于wxWidgets-2.8.7做的。

  顺便交待一下,我用的Code::Block用的是12.11版,GCC版本是4.7.1,操作系统是Win7。

  下载wxWidgets-2.8.7.exe后安装,其实就是将文件解压缩出来,我将其放在F:/wxWidgets-2.8.7中(读者实践中自换文件夹名即可)。

问题1:编译中“内存耗尽”
  按照相关材料的提示,
  (1)在PATH变量中加入F:\Program Files\CodeBlocks\MinGW\bin;
  (2)打开MS-DOS窗口,将当前目录设置为F:\wxWidgets-2.8.7\build\msw;
  (3)运行编译wxWidgets的命令:

  编译方法:

mingw32-make -f makefile.gcc  MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=debug

  编译很慢。伤心的是,最后出来的结果,提示error。最后两行的提示是:

gcc_mswuddll\monodll_xh_bmpcbox.o: file not recognized: Memory exhausted
collect2.exe: error: ld returned 1 exit status

  居然是Memory exhausted
  得不到解释,也想不出道道。换了几次关键词搜索,终于找到了http://www.cnblogs.com/aozima/archive/2011/10/03/2198653.html,其中提到“内存耗尽,是因为32位系统最大只能为应用程序分配2G的内存.”我的系统恰也是32位的。
  怎么解决?
  解决方法:在编译时加入 -fno-keep-inline-dllexport 参数(内联符号不导出),这样DLL文件也小了,链接时占用内存也小了。
  具体步骤:
  (1)找开F:\wxWidgets-2.8.7\build\msw中的config.gcc文件;
  (2)修改config.gcc中的几个参数:

UNICODE ?= 1
CPPFLAGS ?= -Os -fno-keep-inline-dllexport
LDFLAGS ?= -s
RUNTIME_LIBS ?= static

  (3)查看了一下GCC的版本,顺便修改了GCC版本参数

GCC_VERSION ?= 4.7.1

  再运行。

  顺利,再没有出现Memory exhausted

问题2:连接中缺少文件

  利用Code::Blocks提供的向导,生成一个GUI应用,作为体验的开始。

  步骤按向导做就行。生成的程序要运行,有不少的问题,参考“C?o?d?e?B?l?o?c?k?s?编?译?w?x?W?i?d?g?e?t?s?设?置”,工作得以继续进行。

  语法错误就此消除,无非就是头文件找不到之类的。

  而挑战,出现在连接阶段。

  出现的错误提示是:

ld.exe||cannot find -lwxmsw28d_core|
ld.exe||cannot find -lwxbase28d|
|=== Build finished: 2 errors, 0 warnings (0 minutes, 1 seconds) ===

  这是找不到库文件。

  然而,这样的库文件在哪儿呢?

  查看F:\wxWidgets-2.8.7\lib\gcc_dll中,出现的文件如下:
  
  按搜索到的资料,lwxbase28d要对应libwxbase28d.a,期望的文件不存在。
  这时,必须正视编译时运行的命令中的参数了。
  编译命令是:

mingw32-make -f makefile.gcc BUILD=release SHARED=1 MONOLITHIC=1 UNICODE=1

  搜索得知,设置想要如何编译wxWidgets,要编辑文件confg.gcc,以,其中主要设置了如下选项:

SHARED = 1                编译成动态链接库
UNICODE = 1               使用UNICODE(我是中文用户,当然要它了)
BUILD = release           生成正式发行版
MONOLITHIC = 1            生成单一动态链接库

  其实,作为初体验,懒得琢磨这些参数。
  换参数BUILD=debug再次编译:

mingw32-make -j2 -f makefile.gcc SHARED=1 BUILD=debug MONOLITHIC=1 UNICODE=1

  在F:\wxWidgets-2.8.7\lib\gcc_dll中增加的文件是
  
  干脆,改SHARED=0 BUILD=release再来,运行

mingw32-make -j2 -f makefile.gcc SHARED=0 BUILD=release MONOLITHIC=1

  这次,增加了F:\wxWidgets-2.8.7\lib\gcc_lib文件夹,其中的文件是:
  
  将F:\wxWidgets-2.8.7\lib\gcc_lib加入到项目的search directories中,Built项目。令人沮丧的是还有错误,而高兴的是,只有cannot find -lwxbase28d了。
  Build Target现在是“Debug”,试着改为“Release”。再Built项目。好事,通过,没有问题。运行,利用向导生成的项目,正确运行!
  改回“Debug”,问题依然。我希望我的环境中,能够编译Debug版本的程序,这个问题要解决。
  然而,观察发现,BUILD=release时,SHARED=0和SHARED=1的两种情况都已经做过,无论用动态链接库,还是用静态链接库,只要是生成正式发行版(release),现有的库函数都已经具备。而缺少的lwxbase28d嘛,从名称上看,这个d正是debug之意。
  于是,修改参数再编译一遍,这次要生成的是支持静态链接的Debug库文件:

mingw32-make -j2 -f makefile.gcc SHARED=0 BUILD=debug MONOLITHIC=1

  出现的文件:
  
  迫不急待地运行项目。万岁,Build Target是“Debug”时也正常了。
  记录下这个过程。明天开始可以运行wxWidgets自带的Demo了。找到些感觉后,看书,再试着自己写些小程序,适合我的菜鸟学生做的那种。
  这个安装过程的经验是:(1)遇到问题不退缩;(2)搞不清和不到搞清参数的时候,就调整参数,多产生些版本出来。其实,好多经验之谈,也是从这种试探中来的。

附:wxWidgets编译选项简介(给想对编译过程更清楚一些的同学)
  自:http://blog.tianya.cn/blogger/post_show.asp?BlogID=2502562&PostID=25475119

  • BUILD

  BUILD控制wxWidgets构建调试版本(BUILD=debug)或者是发布版本(BUILD=release)。绝大多数情况下你只需要wxWidgets的发布版本就可以了,因为你应该不想要去调试wxWidgets自身,同时你依然可以通过链接wxWidgets的发布版本来构建你自己的程序的调试版本。

    • 调试构建wxWidgets会创建带有”d”后缀的库,例如”libwxmsw28d.a”、”wxmsw28d_gcc_custom.dll”。
    • 调试构建wxWidgets会在wxWidgets库的输出目录中创建”mswd” 或者 “mswud” 目录。
    • 发布构建wxWidgets创建的库没有”d”后缀,例如”libwxmsw28.a”、”wxmsw28_gcc_custom.dll”。
    • 发布构建wxWidgets会在wxWidgets库的输出目录中创建”msw” 或者 “mswu” 目录。
  • SHARED

  SHARED控制wxWidgets是构建DLL(SHARED=1)还是静态库(SHARED=0)。利用构建的DLL,主程序构建时间较快,可执行文件更小。但是可执行文件加上wxWidgets DLL的总大小更大,但是不同的可执行文件可以使用同一个DLL。

    • wxWidgets的DLL构建会创建导入库(如 libwxmsw28.a)以及DLL文件(如wxmsw28_gcc_custom.dll)。你必须在发布你的程序的时候包含这个DLL。
    • wxWidgets的静态构建只会创建静态库(如 libwxmsw28.a),发布的时候也无须包含wxWidgets的DLL。
  • MONOLITHIC

  MONOLITHIC控制是构建一个单一的库(MONOLITHIC=1)还是多个组件库(MONOLITHIC=0)。使用单一构建,项目的设置和开发会更加简单,如果你同时使用DLL构建的话,你只需要分发一个DLL文件。如果使用非单一构建(multilib),会构建出多个不同的库同时你可以避免将整个wxWidgets的基本代码链接到主程序,就可以去掉不需要的库。同时你也必须确保你选择了正确的组件库。

    • wxWidgets的单一构建仅会创建一个wxWidgets导入库(如libwxmsw28.a)以及一个DLL(如wxmsw28_gcc_custom.dll)。
    • wxWidgets的多库(multilib)构建会创建多个导入库(libwx28_base.a等)以及多个DLL文件。
    • 无论何种wxWidgets构建,都会创建额外的静态库(如libwxexpat.a、libwxjpeg.a等)。这些库对于wxWidgets的DLL构建一般是不需要的,但是当使用静态构建的时候,则是必须的。
  • UNICODE

  UNICODE控制wxWidgets以及你的程序是否使用支持Unicode的宽字符串。大多数Windows 2000或更高系统上的应用程序都应该支持Unicode。早期的Windows版本不一定有Unicode支持。你应该总是使用wxWidgets的_("string")和_T("string")宏来确保硬编码的字符串编译时是正确的类型。

    • wxWidgets的Unicode(UNICODE=1)构建将会创建带有”u”后缀的库,例如”libwxmsw28u.a”、”wxmsw28u_gcc_custom.dll”。
    • wxWidgets的Unicode构建会在wxWidgets库的输出目录中创建”mswu”或”mswud”目录。
    • wxWidgets的ANSI(UNICODE=0)构建创建的库没有”u”后缀,例如”libwxmsw28.a”、”wxmsw28_gcc_custom.dll”。
    • wxWidgets的ANSI构建会在wxWidgets库的输出目录中创建”msw”或”mswd”目录。
  • 常见问题
    • 出现类似于”wx/setup.h: No such file or directory”的错误:你在构建选项中缺少了很重要的编译器搜索路径。首先确认你是否在运行wxWidgets项目向导的时候正确选择了wxWidgets的构建配置。如果重新运行向导并配置依然无效,那么打开你的项目的构建选项并给编译起的搜索路径中添加”$(#wx.lib)\gcc_dll\mswu“(这里假设是一个单一的Unicode DLL构建)。
    • 出现类似于”cannot find -lwxmsw28u”的错误:构建选项中的链接库错了。首先确认你是否在运行wxWidgets项目向导的时候正确选择了wxWidgets的构建配置。如果重新运行向导并配置依然无效,确定你构建了什么库,并相应在构建选项中调整库的名字。
================= 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==|
|== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
|== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====

安装wxWidgets遭遇的两大关卡

时间: 2024-10-29 08:14:52

安装wxWidgets遭遇的两大关卡的相关文章

linux下编译安装php各种报错大集合

PHP开源脚本语言 PHP(外文名: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于Web开发领域.PHP的文件后缀名为php. 本文为大家整理汇总了一些linux下编译安装php各种报错大集合 ,感兴趣的同学参考下. 报错1:make 后报错如下: Generating phar.php /home/oldboy/tools/php-5.3.27

Linux下的mysql两大实战:部署Ucenter和Ucenter-home论坛

Linux下的mysql两大实战:部署Ucenter和Ucenter-home论坛 实验目标 实战:搭建Ucenter论坛 搭建Ucenter-home网站 实验环境 LAMP环境搭建 服务端:xuegod63.cn   IP:192.168.1.63 客户端:xuegod64.cn   IP:192.168.1.64 实验步骤   ---搭建LAMP环境部署Ucenter和Ucenter-home网站,搭建一个类人人网的社交网站      实验概述 UCenter 用户中心,实现用户的统一登录

深度解析两大内测分发工具Pre.im与TestFlight

说起移动应用的内测分发平台,众多开发者首要想到的就是国外的TestFlight.不过最近国内的一家测试平台Testin也针对内测分发这一环节推出了平台Pre.im,受到了开发者的追捧.这里,我们就来深度解析一下老牌平台TestFlight与后起之秀Pre.im之间的不同,以便开发者可以更好地选择最适合自己的内测分发工具. 语言环境 这是两者最直观的一个区别,TestFlight从登录界面到帮助文档皆是全英文环境,Pre.im则全是中文.下面,就来个帮助文档方面的对比. 不过,如果开发者对语言方面

wxWidgets初学者导引(2)——下载、安装wxWidgets

生活中的单例 中国(China),位于东亚,是一个以华夏文明为主体.中华文化为基础,以汉族为主要民族的统一多民族国家,通用汉语.中国疆域内的各个民族统称为中华民族,龙是中华民族的象征.古老的中国凭借自身的发展依旧美丽的屹立于东方民族之林,闪耀着她动人的光彩,世界上只有一个中国,任何部分都是祖国不可分割的一部分,今天我们的设计模式就从伟大的祖国开始说起---单例模式. 详解单例模式 单例模式是什么?跟我们的祖国有着怎样的关系呢?首先我们来看一下单例,从"单例"字面意思上理解为-一个类只有

SQL/NoSQL两大阵营激辩:谁更适合大数据

企业在着手推动大数据项目的过程中,经常会遇到这样一个关键性的决策难题--到底该使用哪种数据库方案?经过综合考量,最终的选项往往只剩下 SQL 与 NoSQL 两种.SQL 具有骄人的业绩以及庞大的安装基础,但 NoSQL 却能够带来可观的收益并同样拥有不少支持者.在今天的辩论当中,我们将一同听听两大阵营中各位专家的意见. Network World 网站主编 John Dix 专门组织了此次辩论并邀请到多位专家.其中两位参与专家分别是 VoltDB 公司 CTO Ryan Betts 和 Cou

LINUX系统服务器上搭建DHCP服务,实现两大基本功能:1,自动分配ip;2,手工指定ip

在linux系统服务器上搭建DHCP服务,实现两大基本功能:1,自动分配ip地址:2,手动指定ip地址.首先准备两台虚拟机作为实验对象,一个linux系统作为服务器,一个windows7系统作为客户机,两者使用同一个虚拟网卡vmnet1,并使用仅主机模式.确定服务器上光盘状态为已连接,使用命令查看并挂载光盘检查dhcp软件包是否安装,若没有则使用rpm进行安装.复制dhcp配置文件的模板,并修改编辑dhcp的配置文件,进行相关设定并保存退出=" alt="LINUX系统服务器上搭建DH

告别set和get,两大利器轻松搞定model转换

场景一:一般我们遇到需要新建model,常规做法就是创建一个类,老老实实的定义好model中的所有属性,一般来说属性对应的set方法和get方法都是少不了的,有时候还需要toString甚至equals和hashCode方法. 现在的IDE已经很成熟了,一般不会手写set和get方法,采用IDE自带的快捷方式自动生成居多.如下图所示 该方式相对手写方法来说,效率已经有了很大的提升,但还是有进一步的提升空间(下文会介绍).而且该种方式维护性较差,当需要修改某个属性名称或者属性类型时,对应的set和

老鸟职场经-主动性与表现两大职场发展要素

今日无意中整理资料发现如下为学生就业指导的草稿,和伙伴们分享.主动性:1.发现架构服务等的问题隐患,主动提出问题解决方案.  不要光用口说,而是写好专业的可实施的解决方案提交给领导抉择. 2.领导无意中交代的任务.  越是领导无意中交代的,你更要格外重视,快速响应,并完成! 3.领导:发邮件,让研究技术?这是常有的事,要加班熬夜,最短时间完成,不能影响自己的正常工作.哪怕是加班到半夜,第二天也不要迟到.新工作面临被信任问题,因此无论什么任务,都要最快速度完成.让领导信任,可能就是入职后打2-3个

面向对象之两大要领 (转)

原文: http://cpper.info/2016/01/05/Two-Points-Of-Oriented-Object.html. 总览 在工作初期,我们可能会经常会有这样的感觉,自己的代码接口设计混乱.代码耦合较为严重.一个类的代码过多等等,自己回头看的时候都觉得汗颜.再看那些知名的开源库,它们大多有着整洁的代码.清晰简单的接口.职责单一的类,这个时候我们通常会捶胸顿足而感叹:什么时候老夫才能写出这样的代码! 作为新手,我们写的东西不规范或者说不够清晰的原因是缺乏一些指导原则.我们手中挥