早就想体验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编程起步》。将在Code::Blocks上执行第一个程序。

附: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遭遇的两大关卡的更多相关文章

  1. 大数据学习day26----hive01----1hive的简介 2 hive的安装(hive的两种连接方式,后台启动,标准输出,错误输出)3. 数据库的基本操作 4. 建表(内部表和外部表的创建以及应用场景,数据导入,学生、分数sql练习)5.分区表 6加载数据的方式

    1. hive的简介(具体见文档) Hive是分析处理结构化数据的工具   本质:将hive sql转化成MapReduce程序或者spark程序 Hive处理的数据一般存储在HDFS上,其分析数据底 ...

  2. wxWidgets刚開始学习的人导引(2)——下载、安装wxWidgets

    wxWidgets刚開始学习的人导引全目录   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxS ...

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

    场景一:一般我们遇到需要新建model,常规做法就是创建一个类,老老实实的定义好model中的所有属性,一般来说属性对应的set方法和get方法都是少不了的,有时候还需要toString甚至equal ...

  4. 通过微信Android和iOS版,看两大系统的差异

    由于设计师或者产品经理使用的移动设备大部分是iPhone,所以在做设计时,容易忽略Android和iOS的差异,按照自己的使用习惯进行设计,导致大部分设计师或产品经理做出的设计都是基于iOS规范或习惯 ...

  5. 大数据领域两大最主流集群管理工具Ambari和Cloudera Manger

    不多说,直接上干货! 目前啊,都知道,大数据集群管理方式分为手工方式(Apache hadoop)和工具方式(Ambari + hdp 和Cloudera Manger + CDH).  手工部署呢, ...

  6. linux安装mysql服务分两种安装方法:

    linux安装mysql服务分两种安装方法: ①源码安装,优点是安装包比较小,只有十多M,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错: ②使用官方编译好的二进制文件安装,优点是安装速度 ...

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

    wxWidgets初学者导引全目录   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith ...

  8. Access Violation分成两大类:运行期和设计期(很全的解释)

    用Delphi开发程序时,我们可以把遇到的Access Violation分成两大类:运行期和设计期. 一.设计期的Access Violation 1.硬件原因  在启动或关闭Delphi IDE以 ...

  9. [转帖]两大容器管理平台,Kubernetes与OpenShift有什么区别?

    两大容器管理平台,Kubernetes与OpenShift有什么区别? https://www.sohu.com/a/327413642_100159565 原来openshift 就是 k8s的一个 ...

随机推荐

  1. LaTeX排版设置图表的位置 Positioning images and tables

    Positioning images and tables LATEX is an editing tool that takes care of the format so you only hav ...

  2. iOS开源项目:PullToRefresh

    PullToRefresh实现了类似微博下拉刷新的功能:https://github.com/sonnyparlin/PullToRefresh 首先把PullToRefreshView.h, Pul ...

  3. 深拷贝(deep clone)与浅拷贝(shallow clone)

    深拷贝(deep clone)与浅拷贝(shallow clone) 浅复制(浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复 ...

  4. C++中 使用数组作为map容器VAlue值的解决方法

    1)是用Vector容器代替数组 2)使用数组指针(需要注意局部变量的问题,指针是否需要用new创建) int red [ 3 ]   = { 1 , 0 , 0 }; int green [ 3 ] ...

  5. 用mysqlslap对MySQL进行压力测试

    MySQL5.1地的确提供了好多有力的工具来帮助我们DBA进行数据库管理.现在看一下这个压力测试工具mysqlslap.关于他的选项手册上以及--help介绍的很详细.我解释一下一些常用的选项.这里要 ...

  6. 【Linux】linux bash shell之变量替换::=句法、=句法、:-句法、-句法、=?句法、?句法、:+句法、+句法

    linux bash shell之变量替换::=句法.=句法.:-句法.-句法.=?句法.?句法.:+句法.+句法   linux bash shell之变量替换::=句法.=句法.:-句法.-句法. ...

  7. SqlServer 删除重复记录

    在给一个客户上线的系统里发现有一张表里出现了重复的数据,结果通过排查代码发现确实业务逻辑有问题,在修改了代码后需要将为数据库里的重复数据删除 在CSDN上找到解决方案,对线上的数据库尽量不要执行删除操 ...

  8. 基于java语言的给cube添加custom view来实现权限控制

    今天是农历2014年的最后一个工作日了,在这里提前祝大家新年快乐.羊年大吉!当然本人今天也拿出来点儿真东西,做为献给大家的新年礼物,依次共勉. 下文主要讲述的是使用Java代码来完成对cube基于部门 ...

  9. iOS核心动画 - CALayer

    大家知道,在iOS中所有的视图都继承自UIView. UIView处理所有的触摸事件和画图. 事实上,UIView所有的渲染和动画是托管给另一个类来负责的,它就是CALayer. 但是,需要记住的是, ...

  10. NFC低功耗模式