官方论坛、网上记录的wxWidgets编译方法,会导致编译后的程序库非常大,原因在于对编译的方法选择不当。
下面简单总结一下如何编译最新的SVN代码。
下载最新源码(每日构建):http://biolpc22.york.ac.uk/pub/Daily_HEAD/

或者使用subversion检出:http://www.wxwidgets.org/develop/svn.htm

准备工作:
1. 删除include/wx/msw/setup.h(如果该文件已经存在)
2. 修改setup0.h,设置以下宏的值为 0 !
   WXWIN_COMPATIBILITY_2_8
   wxUSE_EXCEPTIONS

注:我将 wxUSE_EXCEPTIONS 这一选项设置为0以后使用gcc编译器不能成功编译,不知为何?

GCC版本:
修改makefile.gcc文件:区分大小写搜索"_gcc",替换成""

mingw32-make -f makefile.gcc CPPFLAGS="-Os -pipe -mthreads" CXXFLAGS="-fvisibility=hidden -fvisibility-inlines-hidden -Wno-attributes" LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -s" SHARED= BUILD=debug UNICODE= DEBUG_INFO= DEBUG_FLAG= MONOLITHIC= USE_EXCEPTIONS= USE_RTTI= OFFICIAL_BUILD= RUNTIME_LIBS=static
mingw32-make -f makefile.gcc CPPFLAGS="-Os -pipe -mthreads" CXXFLAGS="-fvisibility=hidden -fvisibility-inlines-hidden -Wno-attributes" LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -s" SHARED= BUILD=release UNICODE= DEBUG_INFO= DEBUG_FLAG= MONOLITHIC= USE_EXCEPTIONS= USE_RTTI= OFFICIAL_BUILD= RUNTIME_LIBS=static
mingw32-make -f makefile.gcc CPPFLAGS="-Os -pipe -mthreads" CXXFLAGS="-fvisibility=hidden -fvisibility-inlines-hidden -Wno-attributes" LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -s" SHARED= BUILD=debug UNICODE= DEBUG_INFO= DEBUG_FLAG= MONOLITHIC= USE_EXCEPTIONS= USE_RTTI= OFFICIAL_BUILD= RUNTIME_LIBS=static
mingw32-make -f makefile.gcc CPPFLAGS="-Os -pipe -mthreads" CXXFLAGS="-fvisibility=hidden -fvisibility-inlines-hidden -Wno-attributes" LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -s" SHARED= BUILD=release UNICODE= DEBUG_INFO= DEBUG_FLAG= MONOLITHIC= USE_EXCEPTIONS= USE_RTTI= OFFICIAL_BUILD= RUNTIME_LIBS=static

VC版本:
修改makefile.vc文件:区分大小写搜索"_vc",替换成""

nmake -f makefile.vc CPPFLAGS=/Os LDFLAGS="/MANIFEST:NO /OPT:REF /OPT:ICF" BUILD=debug SHARED= UNICODE= DEBUG_INFO= DEBUG_FLAG= MONOLITHIC= USE_EXCEPTIONS= USE_RTTI= OFFICIAL_BUILD= RUNTIME_LIBS=static
nmake -f makefile.vc CPPFLAGS=/Os LDFLAGS="/MANIFEST:NO /OPT:REF /OPT:ICF" BUILD=release SHARED= UNICODE= DEBUG_INFO= DEBUG_FLAG= MONOLITHIC= USE_EXCEPTIONS= USE_RTTI= OFFICIAL_BUILD= RUNTIME_LIBS=static

VC静态版:

nmake -f makefile.vc CPPFLAGS=/Os LDFLAGS="/MANIFEST:NO /OPT:REF /OPT:ICF" BUILD=release SHARED= UNICODE= DEBUG_INFO= DEBUG_FLAG= MONOLITHIC= USE_EXCEPTIONS= USE_RTTI= OFFICIAL_BUILD= RUNTIME_LIBS=static

大家在编译时,可以视情况调整选项,由于我在编译wxWidgets时,习惯一个工程要同时兼容VC和GCC编译器,而且一些小程序,喜欢在最终发布时使用静态链接发布的方法,所以才有了上面的三个版本。

通过这些选项,可以最大程度的减小生成的库的大小,以及静态链接要执行文件的大小。

你便会发现,其实通过适当的方法,是可以尽量的减小wxWidgets生成库的大小的。

以今天的svn源码为例:

(GCC版)wxmsw292u.dll 6.65MB

(VC版)wxmsw292u.dll 6.66MB

静态版可执行文件:

(GCC版)2.01MB

(VC版)1.31MB

其中两个选项:USE_EXCEPTIONS=0 USE_RTTI=0由于在wxWidgets库中不使用RTTI和异常,这会大幅度减小可执行文件的体积(减小30%左右),取消这两个选项,只能说明在wx库中不再支持RTTI和异常,但不代码你基于wx的程序中不能使用RTTI和异常!

至于这两个开关是否导致wx的功能缺少,这我目前还没有查找到任何依据。

不过,官方的wiki是支持这种做法的:http://wiki.wxwidgets.org/Reducing_Executable_Size

可以确定的是:使用VC编译器对最终程序的发行,无论是程序体积、还是速度,都明显优于GCC(MinGW)。

基于wxWidgets开发的朋友,如果要在Windows平台上发布程序,建议使用VC。

说明:

  1. VC编译器在优化体积的其他一些做法,例如/ALIGN、 /MERGE选项,通过实践证明,不但不能减小wxWidgets编译后的二进制体积,反而起到相反的效果。
  2. 以上测试只在Windows平台测试通过,并未在Linux平台进行验证。

转载说明:该文章转载自老邓的CSDN博客,版权归原作者所有。

(转)wxWidgets 2.9.2svn(3.x)最小体积编译方法的更多相关文章

  1. OTG 接口烧写最小Linux的方法

    通过该方式可以烧写Android4.0.3 系统和Linux-QT 系统. 需要准备一根OTG 线,绝大多数智能手机和PC 机相连接的线都是OTG线,都是通用的. 这种方式比TF卡烧写方式要快一些,我 ...

  2. CentOS 6.0最小化编译安装Nginx+MySQL+PHP+Zend

    http://www.osyunwei.com/archives/235.html 引言: 操作系统:CentOS 6.0 32位         下载地址:http://mirrors.163.co ...

  3. 解决ie6支持最大高度最小高度的方法

    1.IE6支持max-height解决方法 IE6支持最大高度解决CSS代码:.yangshi{max-height:1000px;_height:expression((document.docum ...

  4. 有向图最小路径覆盖方法浅析、证明 //hdu 3861

    路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联. 对于一个有向无环图怎么求最小路径覆盖? 先构造二分图: 对于原图,先拆点,吧每个点i拆成ii,iii. ...

  5. Mysql Group by 分组取最小的实现方法

    表结构如下图:

  6. 腾讯物联网操作系统正式开源,最小体积仅1.8 KB

    9月18日,腾讯宣布将开源自主研发的轻量级物联网实时操作系统TencentOS tiny.相比市场上其它系统,腾讯TencentOS tiny在资源占用.设备成本.功耗管理以及安全稳定等层面极具竞争力 ...

  7. ShellCode 最小化编译优化

    1.生成ShellCode [root@localhost ~]# msfvenom -a x86 --platform Windows \ > -p windows/meterpreter/r ...

  8. wxWidgets 的 Linux / Windows 混合开发环境

    目标 建立一个开发 GUI 交互界面程序的环境,要求: 以 C/C++ 为主要程序设计语言. 最好能充分利用已有的 MFC 开发经验. 以 Linux 为主要开发环境.可以在 Windows 中编译并 ...

  9. [zhuan] linux 下 wxWidgets 安装,编译

      http://blog.csdn.net/yuzhenxiong0823/article/details/7727133 wxWidgets在Linux下有wxGTK和wxX11供使用,各需要GT ...

随机推荐

  1. HubbleDotNet 最新绿色版,服务端免安装,基于eaglet 最后V1.2.8.9版本开发,bug修正,支持一键生成同步表

    HubbleDotNet 是一个基于.net framework 的开源免费的全文搜索数据库组件.开源协议是 Apache 2.0.HubbleDotNet提供了基于SQL的全文检索接口,使用者只需会 ...

  2. Hive 的简单使用及调优参考文档

    Hive 的简单使用及调优参考文档   HIVE的使用 命令行界面 使用一下命令查看hive的命令行页面, hive --help --service cli 简化命令为hive –h 会输出下面的这 ...

  3. 读书笔记 effective c++ Item 27 尽量少使用转型(casting)

    C++设计的规则是用来保证使类型相关的错误不再可能出现.理论上来说,如果你的程序能够很干净的通过编译,它就不会尝试在任何对象上执行任何不安全或无意义的操作.这个保证很有价值,不要轻易放弃它. 不幸的是 ...

  4. MOSFET使用与H桥驱动问题

    0.小叙闲言 最开始学习三极管的时候,很注重它的工作原理,后来到了实际应用,就直接把三极管或MOSFET直接当作一个开关器件使用.直到前这几天,接触到MOSFET组成的H桥驱动电路时,发现它纯当作一个 ...

  5. 【WPF】学习笔记(二)——依旧是一个电子签名板

    这篇博客呢,主要谈谈在实现电子签名功能中踩过的几个坑:1.System.BadImageFormatException异常:2.无法加载DLL“###.dll”,: 找不到指定的模块. (异常来自 H ...

  6. android webview和 javascript 进行交互

    HTML5进行app开发具有开发快,跨平台等优点,但是当客户需要访问照相机或者调用摄像头等硬件的时候,H5就会有限制,必须要调用原生方法进行设备访问.下面简要介绍JS和原生方法互相调用的方法: 1 在 ...

  7. python中的一些小知识

    在最近学习python中遇到的一些小问题汇总一下: 1.在windows7下安装python3.5版本时提示安装不了,缺少ServicePack1.  解决办法是,打开控制面板\系统和安全\Windo ...

  8. H5游戏见缝插针开发

    中秋节马上就要来临,公司开发了一个h5小游戏叉月饼,其实就是游戏“见缝插针”的翻版.这个游戏的开发任务落到了我的头上... 一 游戏介绍 游戏场景基本如下所示:         二 所用工具 这次的开 ...

  9. JS判断PC和移动端设备

    1.方法一 function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", ...

  10. redis-key相关命令

    本篇主要介绍和redis的key进行操作的相关命令. 命令 描述 复杂度 返回值 DEL key [key ...] 删除给定的一个或多个 key .不存在的 key 会被忽略.删除单个列表.集合.有 ...