zoukankan      html  css  js  c++  java
  • (转)wxWidgets 2.9.2svn(3.x)最小体积编译方法

    官方论坛、网上记录的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=1 BUILD=debug UNICODE=1 DEBUG_INFO=0 DEBUG_FLAG=1 MONOLITHIC=1 USE_EXCEPTIONS=0 USE_RTTI=0 OFFICIAL_BUILD=1 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=1 BUILD=release UNICODE=1 DEBUG_INFO=0 DEBUG_FLAG=0 MONOLITHIC=1 USE_EXCEPTIONS=0 USE_RTTI=0 OFFICIAL_BUILD=1 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=1 BUILD=debug UNICODE=1 DEBUG_INFO=0 DEBUG_FLAG=1 MONOLITHIC=1 USE_EXCEPTIONS=0 USE_RTTI=0 OFFICIAL_BUILD=1 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=1 BUILD=release UNICODE=1 DEBUG_INFO=0 DEBUG_FLAG=0 MONOLITHIC=1 USE_EXCEPTIONS=0 USE_RTTI=0 OFFICIAL_BUILD=1 RUNTIME_LIBS=static

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

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

    VC静态版:

    nmake -f makefile.vc CPPFLAGS=/Os LDFLAGS="/MANIFEST:NO /OPT:REF /OPT:ICF" BUILD=release SHARED=0 UNICODE=1 DEBUG_INFO=0 DEBUG_FLAG=0 MONOLITHIC=1 USE_EXCEPTIONS=0 USE_RTTI=0 OFFICIAL_BUILD=1 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博客,版权归原作者所有。

  • 相关阅读:
    Java动态代理(三)——模拟AOP实现
    Java动态代理(二)CGLIB动态代理应用
    Java动态代理(一)动态类Proxy的使用
    CGLIB实现动态代理
    初识Java微信公众号开发
    spring+ibatis事务管理配置
    什么是事务的传播特性
    Spring事务配置的五种方式
    Java语言基础(五) Java原始数据类型的分类以及数据范围
    Java语言基础(四) String和StringBuffer的区别
  • 原文地址:https://www.cnblogs.com/huixch/p/3339325.html
Copyright © 2011-2022 走看看