wxWidgets 2.9.2(3.x)最小体积编译方法

Loaden 2010-11-22 10:35:31
官方论坛、网上记录的wxWidgets编译方法,会导致编译后的程序库非常大,原因在于对编译的方法选择不当。
下面简单总结一下如何编译最新的SVN代码。
下载最新源码或者svn checkout:
http://biolpc22.york.ac.uk/pub/Daily_HEAD/
svn checkout http://svn.wxwidgets.org/svn/wx/wxWidgets/trunk


得到源码后,我的编译方法如下:
准备工作:
1. 删除include\wx\msw\setup.h(如果该文件已经存在)
2. 修改setup0.h,搜索“WXWIN_COMPATIBILITY_2_8”,修改其值为0,即放弃对wx2.8代码的兼容,强制用户更新代码。

GCC版本:
修改makefile.gcc文件:区分大小写搜索"_gcc"
mingw32-make -f makefile.gcc CPPFLAGS=-Os LDFLAGS=-s SHARED=1 BUILD=debug UNICODE=1 DEBUG_INFO=0 DEBUG_FLAG=1 MONOLITHIC=1 OFFICIAL_BUILD=1 RUNTIME_LIBS=static
mingw32-make -f makefile.gcc CPPFLAGS=-Os LDFLAGS=-s SHARED=1 BUILD=release UNICODE=1 DEBUG_INFO=0 DEBUG_FLAG=0 MONOLITHIC=1 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 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 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 OFFICIAL_BUILD=1 RUNTIME_LIBS=static


说明:
1. 准备工作的第一步是必须的,因为svn版,setup0.h可能发生变化,所以需要删除旧setup.h,以便生成最新的setup.h
2. 准备工作的第二步是建议的,强烈建议修改代码以适应新版本
3. 修改makefile.gcc或者makefile.vc,是为了把最终生成的dll的编译器标志去除,因为不好看。
4. 为了减小体积,对所有的编译都加了尺寸优化的编译选项,VC是/Os,GCC是-Os,及加了优化尺寸的链接选项。
5. 为了减小体积,Debug版中不再保留DEBUG信息,因为很少有调试到wx库内部的时候。

最终生成的wxmsw292u.dll动态库,VC版只有7.87MB,而GCC版稍大些,10MB。
除了一个opengl的dll外,这已经是所有wx库的dll大小了。
...全文
1279 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
kerosun 2012-04-25
  • 打赏
  • 举报
回复
老邓有时间帮忙介绍一下用eclipse开发wxWidgets应用时,怎么配置参数。

如果是一个简单的示例(一个窗口输出个hello字符串)
应该如何写makefile
构建命令应该怎么写
库就用你上面的方法编译
环境是winxp+MinGW+eclipse+cdt
「已注销」 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xunxun1982 的回复:]
恩,我用qconfig试验了下,确实不能用于桌面开发,不过VC比gcc生成的文件是小,不知C::B何时支持用VC来编译自身,不知道另一个Codelite能用VC来编译自身么。
[/Quote]
也不可以。
关于编译总结,我发了一篇博文:http://blog.csdn.net/Loaden/archive/2010/11/25/6033771.aspx
xunxun 2010-11-25
  • 打赏
  • 举报
回复
恩,我用qconfig试验了下,确实不能用于桌面开发,不过VC比gcc生成的文件是小,不知C::B何时支持用VC来编译自身,不知道另一个Codelite能用VC来编译自身么。
「已注销」 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xunxun1982 的回复:]
呵呵,Qt的缩减组件做的比较隐秘,我做过一段时间的Qt嵌入式,对Qt缩减组件有一定的了解。
Qt缩减组件存放在qconfig-xxx.h的头文件里,他一般有几个默认配置,有qconfig-small.h、qconfig-medium.h之类,当然Qt还提供一个qconfig的可视化工具(好像在tools目录下,可能需要自己编译),来自由增减组件。这样,在config的时候,如果你要使用qconfig-small.h组件,就可以使用configure -qconfig small进行启用。
[/Quote]
我没做过嵌入式,但据我网上查证,通过qconfig来精简的,只适用于嵌入式开发,不适用于桌面开发。
「已注销」 2010-11-23
  • 打赏
  • 举报
回复
-finline-limit=100选项没有必要。
-Wa,-R选项也可忽略。
最终:
准备工作:
1. 删除include\wx\msw\setup.h(如果该文件已经存在)
2. 修改setup0.h,搜索“WXWIN_COMPATIBILITY_2_8”,修改其值为0,即放弃对wx2.8代码的兼容,强制用户更新代码。

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 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 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 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 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 OFFICIAL_BUILD=1 RUNTIME_LIBS=static
xunxun 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 loaden 的回复:]

引用 8 楼 xunxun1982 的回复:
其实wx和Qt都可以根据自己的项目进行缩减组件,不编译就行了,这样也会大大减小体积。

这一点,wx可以做到,但Qt却很难做到。
因为wx可以在setup0.h中控制每一个组件是否编译。
甚至,可以只编译你程序中用到的组件,其他组件一个也不要。

而Qt的组件化已经很清楚了,你禁掉的,只是一些其他组件,对于QtCore和QtGui这两个……
[/Quote]

呵呵,Qt的缩减组件做的比较隐秘,我做过一段时间的Qt嵌入式,对Qt缩减组件有一定的了解。
Qt缩减组件存放在qconfig-xxx.h的头文件里,他一般有几个默认配置,有qconfig-small.h、qconfig-medium.h之类,当然Qt还提供一个qconfig的可视化工具(好像在tools目录下,可能需要自己编译),来自由增减组件。这样,在config的时候,如果你要使用qconfig-small.h组件,就可以使用configure -qconfig small进行启用。
「已注销」 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xunxun1982 的回复:]
其实wx和Qt都可以根据自己的项目进行缩减组件,不编译就行了,这样也会大大减小体积。
[/Quote]
这一点,wx可以做到,但Qt却很难做到。
因为wx可以在setup0.h中控制每一个组件是否编译。
甚至,可以只编译你程序中用到的组件,其他组件一个也不要。

而Qt的组件化已经很清楚了,你禁掉的,只是一些其他组件,对于QtCore和QtGui这两个组件,你是很难减肥的。
这两个组件的DLL加起来,即使优化,也达到8MB以上。
「已注销」 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ollydbg23 的回复:]
QT主要有钱,wx主要没有钱。
不过我还是支持wx!!!
[/Quote]
我也支持wx,所以有的时候就在想,应该尽可能的为wxWidgets做点贡献:测试、提供补丁等。
不过,我对wx的使用掌握的只是一些皮毛。

这是优化后的编译配置,主要针对GCC编译器进行了优化。

准备工作:
1. 删除include\wx\msw\setup.h(如果该文件已经存在)
2. 修改setup0.h,搜索“WXWIN_COMPATIBILITY_2_8”,修改其值为0,即放弃对wx2.8代码的兼容,强制用户更新代码。

GCC版本:
修改makefile.gcc文件:区分大小写搜索"_gcc"
mingw32-make -f makefile.gcc CPPFLAGS="-Os -Wa,-R -pipe -mthreads -finline-limit=100" 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 OFFICIAL_BUILD=1 RUNTIME_LIBS=static
mingw32-make -f makefile.gcc CPPFLAGS="-Os -Wa,-R -pipe -mthreads -finline-limit=100" 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 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 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 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 OFFICIAL_BUILD=1 RUNTIME_LIBS=static


有兴趣的朋友,可以参考下步金国的GCC编译链接选项中文版:
http://lamp.linux.gov.cn/Linux/optimize_guide.html
「已注销」 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xunxun1982 的回复:]
其实wx和Qt都可以根据自己的项目进行缩减组件,不编译就行了,这样也会大大减小体积。
[/Quote]
这只能影响wx库的大小,并不会影响最后生成的可执行文件的大小。
当然,前提是静态链接。
如果是动态链接,则通过缩减组件来减小库的体积,这还是很有意义的。
zzw_happy 2010-11-22
  • 打赏
  • 举报
回复
wx的稳定性如何啊?我记得1991年就有这个东西了。为什么这么多年过去了都没有像样的发展?
「已注销」 2010-11-22
  • 打赏
  • 举报
回复
详见:http://docs.wxwidgets.org/trunk/classwx_string.html
The wxString class has been completely rewritten for wxWidgets 3.0 and this change was actually the main reason for the calling that version wxWidgets 3.0.
「已注销」 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tonymiller 的回复:]

顶一下,就是3.0的更新遥遥无期啊。另外发现2.9和2.8的兼容性极差,我在2.8.11下跑的好好的程序,到2.9下面密密麻麻的错误。
[/Quote]
兼容性差的主要原因是wx的代码变动大!
其中wxString应该是重写过的。
tonymiller 2010-11-22
  • 打赏
  • 举报
回复
顶一下,就是3.0的更新遥遥无期啊。另外发现2.9和2.8的兼容性极差,我在2.8.11下跑的好好的程序,到2.9下面密密麻麻的错误。
「已注销」 2010-11-22
  • 打赏
  • 举报
回复
当然,wxWidgets的缺点也很明显。
1. 界面不够华丽;
2. 稳定性还有所欠缺;
3. 开发人员不多,目前主力开发的似乎只有VZ一个人;
4. 官方论坛也比原来冷清多了。

优点:
1. 原生界面
2. 商业版可以静态链接wx程序库
3. 编译后的体积、内存占用占优
4. 纯C++库,不像Qt,要借助moc来转换
5. 发现库的问题调试起来要比Qt容易
nbgjh130 2010-11-22
  • 打赏
  • 举报
回复
我也不够了 来看看
「已注销」 2010-11-22
  • 打赏
  • 举报
回复
与Qt相对比,wxWidgets要尺寸、内存占用上是有较大优势的。
相对Qt最大的优势是可以在商业程序中静态链接wx库。
在一个简单的wxFrame测试示例中,使用静态编译+VC编译器,生成的最终单文件大小:1.56MB。
虽然比wx2.8.x大了很多(我记得是860KB左右),但相对Qt的静态编译单文件至少5MB相比,优势还是很大的。
ollydbg23 2010-11-22
  • 打赏
  • 举报
回复
QT主要有钱,wx主要没有钱。
不过我还是支持wx!!!
xunxun 2010-11-22
  • 打赏
  • 举报
回复
其实wx和Qt都可以根据自己的项目进行缩减组件,不编译就行了,这样也会大大减小体积。

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧