早就想体验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. C#启动外部程序以及等待外部程序关闭的几种方法

    1. 启动外部程序,不等待其退出. 2. 启动外部程序,等待其退出. 3. 启动外部程序,无限等待其退出. 4. 启动外部程序,通过事件监视其退出. // using System.Diagnosti ...

  2. 数学图形(2.13)Spherical trochoid曲线

    该曲线与上一节的herical cycloid球面外摆曲线 很相似,难道这是球面内摆曲线? #http://www.mathcurve.com/courbes3d/cycloidspheric/tro ...

  3. OkHttp 使用案例 文档翻译 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. 改善你的jQuery的25个步骤

    1. 从Google Code加载jQueryGoogle Code上已经托管了多种JavaScript类库,从Google Code上加载jQuery比直接从你的服务器加载更有优势.它节省了你服务器 ...

  5. C++primer习题--第3章

    本文地址:http://www.cnblogs.com/archimedes/p/cpp-primer-chapter3-ans.html,转载请注明源地址. [习题 2.11]编写程序,要求用户输入 ...

  6. 【Python】Django RestFramework资料

    A ReSTful API is becoming a standard component of any modern web application.  The Django Rest Frame ...

  7. Yii学习笔记之二(使用gii生成一个简单的样例)

    1. 数据库准备 (1) 首先我们建一数据库 yii2test 并建立一张表例如以下: DROP TABLE IF EXISTS `posts`; CREATE TABLE `posts` ( `po ...

  8. [React] Preventing extra re-rendering with function component by using React.memo and useCallback

    Got the idea form this lesson. Not sure whether it is the ncessary, no othere better way to handle i ...

  9. spring错误汇总

    在学习spring过程中遇见了种种不同的异常错误,这里做了一下总结.希望遇见类似错误的同学们共勉一下. 1. 错误一 Error creating bean with name 'helloServi ...

  10. Unity3D开发之Mac OS 开发环境搭建 笔记

    http://www.cnblogs.com/zhaoqingqing/p/3383167.html 首先上几张图: 摸索了一上午,才搞定在模拟器中运行.至于在Iphone真机中运行,虽然有开发者证书 ...