VC2008静态编译Qt4.6.1总结,upx压缩后尺寸疑问?

老邓 2010-01-21 05:20:28
昨天发现Qt发布了4.6.1,于是决定用VC2008编译一个Qt的纯静态版本:不依赖VC运行库(/MT),也不依赖Qt运行库。
研究了一下,在不增加任何第三方库的情况下,方法如下。

增加环境变量
QTDIR=D:\qt-everywhere-opensource-src-4.6.1
PATH=%QTDIR%;%PATH%

静态CRT
mkspecs目录,找到 win32-msvc2008 目录,编辑qmake.conf,将QMAKE_CFLAGS_XXXXXXX全改成静态。就是把MD改成MT,把MDd改成MTd。

配置
configure -prefix D:\Qt461 -debug-and-release -platform win32-msvc2008 -static -fast -opensource -no-exceptions -no-dsp -no-vcproj -no-qt3support -no-accessibility -no-rtti -no-opengl -no-gif -qt-libpng -qt-libjpeg -no-libmng -no-libtiff -no-zlib -no-webkit -no-openssl -no-dbus -no-phonon -no-phonon-backend -no-multimedia -no-audio-backend -no-declarative -no-script -no-scripttools -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde -qt-style-windowsxp -qt-style-windowsvista -nomake examples -nomake docs -nomake demos -nomake translations

编译:nmake
安装:nmake install

之后又编译了demo,想看看效果。于是进入demos目录,执行:nmake release

编译后,Release版本,最小的EXE大小是:4.5MB,最大的EXE大小是:5.8MB。比用MinGW 4.4编译的尺寸要小2-3MB。
然后用Upx压缩,默认参数的情况下,Upx压缩率可以达到40%左右。压缩后的最小demo是2MB,最大的是2.4MB。

没有压缩release版本:
程序尺寸: 5.44 MB
内存占用:
第一次运行: 10496 K 4984 K
最小化后: 1100 K 4984 K
恢复窗口: 6476 K 4988 K
再次最小化: 1092 K 4988 K

upx默认参数压缩后:
程序尺寸: 2.28MB
内存占用:
第一次运行: 13268 K 10548 K
最小化后: 1116 K 10548 K
恢复窗口: 6532 K 10548 K
再次最小化: 1104 K 10548 K


我的问题是:为什么Upx压缩后,内存占用会升高?尤其是虚拟内存,竟然增大了2倍多!

后记:编译安装到D:/Qt461目录后,整个目录469MB,其中bin目录72.2MB,include目录7.85MB,lib目录380MB,plugins目录7.86MB。
看来没有传说中的那么大体积。
默认安装后,不会将pdb文件拷贝到安装目录中,这样调试时将无法进入Qt的源码,不过这并不成问题,毕竟大家只是Qt的使用者,而不是开发者。
...全文
1189 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
老邓 2010-11-05
  • 打赏
  • 举报
回复
编译4.7记录:
configure -prefix D:\DengYC\LoveDEV\qt -release -platform win32-msvc2010 -static -fast -opensource -no-qt3support -no-openssl -no-webkit -nomake examples -nomake docs -nomake demos -nomake translations
修改值:
QMAKE_CFLAGS_RELEASE = -Os -MT
QMAKE_CFLAGS_DEBUG = -Zi -MTd
及链接:
QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /OPT:REF /OPT:ICF
希望能大大的减小编译后的程序尺寸!
土著巫师 2010-09-15
  • 打赏
  • 举报
回复
我的程序大约有22M,不管用不用--lzma,程序跑起来以后大约多了22M内存(非虚拟内存),如果不用UPX压缩马上降下来,不知道如何是好。:(
hannyhe 2010-02-09
  • 打赏
  • 举报
回复
这东西,唉
还太短,呵
老邓 2010-02-02
  • 打赏
  • 举报
回复

增加环境变量:
QTDIR=D:\qt-everywhere-opensource-src-4.6.1
PATH=%QTDIR%\bin;%PATH%


一、VC只编译静态版本

静态CRT:
mkspecs目录,找到 win32-msvc2008 目录,编辑qmake.conf,将QMAKE_CFLAGS_XXXXXXX全改成静态。就是把MD改成MT,把MDd改成MTd。

配置:
configure -prefix D:\DengYC\LoveDEV\qt -release -platform win32-msvc2008 -static -fast -opensource -no-exceptions -no-dsp -no-vcproj -no-qt3support -no-accessibility -no-rtti -no-opengl -no-gif -qt-libpng -qt-libjpeg -no-libmng -no-libtiff -no-zlib -no-webkit -no-openssl -no-dbus -no-phonon -no-phonon-backend -no-multimedia -no-audio-backend -no-declarative -no-script -no-scripttools -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde -qt-style-windowsxp -qt-style-windowsvista -nomake examples -nomake docs -nomake demos -nomake translations

静态编译版,用于正式发布程序:
configure -prefix D:\DengYC\LoveDEV\qt -release -platform win32-msvc2008 -static -fast -opensource -no-qt3support -no-zlib -no-openssl -no-webkit -nomake examples -nomake docs -nomake demos -nomake translations

动态编译版,用于编译Qt Creator:
configure -prefix D:\DengYC\LoveDEV\qt -release -platform win32-msvc2008 -shared -fast -opensource -no-qt3support -no-zlib -no-openssl -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde -nomake examples -nomake docs -nomake demos -nomake translations

编译安装:nmake && nmake install


二、MinGW编译版本

配置:
configure -prefix D:\DengYC\LoveDEV\qt -debug-and-release -platform win32-g++ -shared -fast -opensource -no-exceptions -no-dsp -no-vcproj -no-qt3support -no-accessibility -no-rtti -no-gif -qt-libpng -qt-libjpeg -no-libmng -no-libtiff -no-zlib -no-webkit -no-openssl -no-dbus -no-phonon -no-phonon-backend -no-multimedia -no-audio-backend -no-declarative -no-script -no-scripttools -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde -qt-style-windowsxp -qt-style-windowsvista -nomake examples -nomake docs -nomake demos -nomake translations
configure -prefix D:\DengYC\LoveDEV\qt -debug-and-release -platform win32-g++ -shared -fast -opensource -no-qt3support -no-zlib -no-openssl -no-webkit -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde -nomake examples -nomake demos -nomake translations

编译安装:mingw32-make && mingw32-make install


如编译Qt4.6.1失败,可参考:http://bugreports.qt.nokia.com/browse/QTBUG-5670
for an unknown reason you must copy the headers mingw64\x86_64-w64-mingw32\include\stddef.h and mingw64\x86_64-w64-mingw32\includefloat.h to the Qt/inclue directory.
原因是找不到float.h中的函数定义,这是Qt自身的问题。
老邓 2010-01-23
  • 打赏
  • 举报
回复

增加环境变量:
QTDIR=D:\qt-everywhere-opensource-src-4.6.1
PATH=%QTDIR%\bin;%PATH%


一、VC只编译静态版本

静态CRT:
mkspecs目录,找到 win32-msvc2008 目录,编辑qmake.conf,将QMAKE_CFLAGS_XXXXXXX全改成静态。就是把MD改成MT,把MDd改成MTd。

配置:
configure -prefix D:\DengYC\LoveDEV\Qts -release -platform win32-msvc2008 -static -fast -opensource -no-exceptions -no-dsp -no-vcproj -no-qt3support -no-accessibility -no-rtti -no-opengl -no-gif -qt-libpng -qt-libjpeg -no-libmng -no-libtiff -no-zlib -no-webkit -no-openssl -no-dbus -no-phonon -no-phonon-backend -no-multimedia -no-audio-backend -no-declarative -no-script -no-scripttools -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde -qt-style-windowsxp -qt-style-windowsvista -nomake examples -nomake docs -nomake demos -nomake translations

编译:nmake
安装:nmake install


二、MinGW编译版本

配置:
configure -prefix D:\DengYC\LoveDEV\Qt -debug-and-release -platform win32-g++ -shared -fast -opensource -no-exceptions -no-dsp -no-vcproj -no-qt3support -no-accessibility -no-rtti -no-gif -qt-libpng -qt-libjpeg -no-libmng -no-libtiff -no-zlib -no-webkit -no-openssl -no-dbus -no-phonon -no-phonon-backend -no-multimedia -no-audio-backend -no-declarative -no-script -no-scripttools -no-style-plastique -no-style-cleanlooks -no-style-motif -no-style-cde -qt-style-windowsxp -qt-style-windowsvista -nomake examples -nomake docs -nomake demos -nomake translations

编译:mingw32-make
安装:mingw32-make install


如编译Qt4.6.1失败,可参考:http://bugreports.qt.nokia.com/browse/QTBUG-5670
for an unknown reason you must copy the headers mingw64\x86_64-w64-mingw32\include\stddef.h and mingw64\x86_64-w64-mingw32\includefloat.h to the Qt/inclue directory.
原因是找不到float.h中的函数定义,这是Qt自身的问题。
老邓 2010-01-21
  • 打赏
  • 举报
回复
谢谢!

QT编译的程序,占用内存确实比较大。
但在这个内存标配2G的年代,这个还真不算啥了。
界面太漂亮了!

耍宝王 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 loaden 的回复:]
TO pgplay:嗯,谢谢。是否所有的压缩都不可避免这个解压过程?
如果设计好的话,只要在内存中保留解压后的一份即可,为何还要保存压缩的那份呢?
[/Quote]
是的

这应该是由程序的加载机制决定的,因为程序在内存中是一串指令序列和数据序列,在内存中似乎只能改变数据序列的内容,无法删除和修改指令序列(除非退出),这牵扯到计算机软件原理,具体的我也不是很清楚

[Quote=引用 3 楼 jackyjkchen 的回复:]
降低效率也仅仅在启动时,运行时没有效率开销的。
[/Quote]
对哦,启动后程序运行指令就是直接跳转到解压后的程序上去了,谢谢提醒,以前一直忽略了
老邓 2010-01-21
  • 打赏
  • 举报
回复
没有使用upx --lzma.
如果使用lzma引擎,最小尺寸可以达到1.76MB。

经测试,当使用upx --lzma *.exe时,发现虚拟内存占用是一样的,内存反而小了20~200KB。
jackyjkchen 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pgplay 的回复:]
P.S 其实用Upx等软件压缩是会降低程序运行效率的,程序再大一点,你就会明显感到程序启动时的解压这个过程
[/Quote]
降低效率也仅仅在启动时,运行时没有效率开销的。

老邓用的upx lzma引擎?关掉试试看
老邓 2010-01-21
  • 打赏
  • 举报
回复
TO pgplay:嗯,谢谢。是否所有的压缩都不可避免这个解压过程?
如果设计好的话,只要在内存中保留解压后的一份即可,为何还要保存压缩的那份呢?
耍宝王 2010-01-21
  • 打赏
  • 举报
回复
因为两个字“解压”

未压缩的程序加载到内存后被CPU“直接”运行

而压缩的程序被加载到内存后,其被压缩部分会被解压(也放在内存中)再通过CPU运行,类似内存中有程序的两个拷贝(一个压缩,一个未压缩,再加上一些程序指令跳转之类的链接)

P.S 其实用Upx等软件压缩是会降低程序运行效率的,程序再大一点,你就会明显感到程序启动时的解压这个过程

64,656

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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