版本1:
为什么要静态编译?如果不是静态编译程序,那我们写的程序文件编译生成可执行文件必须依赖QT和MinGW的一些库 文件,虽然我们可以将这些依赖的 dll文件一同打包发布,但毕竟看起来不是很好看,而且库内有的东西我们根本用不到,还是要复制整个dll,造成程序发布包比较大。那么,怎么才能使我们 的程序在没有安装QT和MinGW的系统上照样运行呢?
首先,要保证QT是静态编译版本。一般我们用的QT都不是静态编译的,需要我们重新编译。在开始菜单里打开"Qt 4.x.x Command Prompt",这时默认是在QT目录里面,分别运行如下命令:
configure -release -static -fast
make
make clean
最后一部其实也算可有可无,第二步在我的电脑上运行了将近3个小时,慢慢等就是。 这样就生成了QT的静态编译版本,我们的程序编译时会自动把QT相关的依赖包含进去。
其次,解决MinGW的mingwm10.dll依赖问题。一般只有用到threads的时候才用到mingwm10.dll,我们通常遇到的"缺少 mingwm10.dll"问题,可以在程序qmake生成makefile.release文件后删除"-mthreads"参数即可,一般在 "LFLAGS"后面。当然,这只是临时解决方案,每次都要手动修改,也可以在编译QT前先修改qmake.h,不过不推荐这种方法。其实, mingwm10.dll也就十多K,每次发布程序时一起打包也无所谓。
更多信息可以参考:
http://lists.trolltech.com/qt-interest/2006-08/thread00942-0.html
http://lists.trolltech.com/qt-in ... 381-0.html#msg00553
这样编译出来的程序比较大,可以先用strip命令去掉程序里面一些无用信息后,用ASPack或者UPX之类的压缩加壳软件压缩一下,两者的压缩率基本 都达到30%多一点,压缩效果还是很明显的。
版本2:
Qt默认的编译方式是动态编译的,但是有时候你编写的程序要发布出去,带很多动态库文件是很繁琐的,此时就需要静态编译你的程序,Qt要实现静态编译必须 库文件也是静态编译的,可以用这个命令编译静态库:
在开始菜单里找到Qt Command Prompt并运行,输入命令: configure -static -debug-and-release -no-exceptions
上一条命令运行成功后再输入命令: mingw32-make sub-src
等1 ~3 小时可能就运行完了 完成后就ok了。。。
当然你能编译成功的前提是你的一些路径配置都弄好了,还有许多人都只编译了release即发行版本的静态库,没有编译debug(调试版本)的静态 库,于是你用Qt Creator的时候,如果debug选择调试模式的话,那么此时就会出现: collect2: ld returned 1 exit status 以及can't find lQtGuid4 这样的错误提示,解决办法就是输入命令:configure -static debug,然后在mingw32-make sub-src,可能要编译两到三个小时,如果你不加sub-src编译的时间还要长,10个多小时吧,直接make的结果是包括qt程序在内全部编译, 当然花的时间要长很多。
还有我比较推荐用qt写c++程序,而不是visua c++,因为它的跨平台性非常好,windows linux以及mac都可以使用,visual c++是达不到的。
问题:
Simply leave out Phonon (the audio component) because it is not allowed with static linking mode. (This is a bug in the build system). You'd think they'd at least build all the configurations before release...
So, to build Qt 4.6 (2009.05) for a statically-linked application, cd to your qt directory (e.g. C:\Qt\2009.05\qt) and simply build it without phonon.
mingw32-make distclean
config -confclean
configure -static -no-phonon -no-phonon-backend -debug-and-release -no-exceptions
mingw32-make sub-src
This built the Qt system, and my app ran successfully after I built it in Qt Creator. Unfortunately, now the QLabel refuses to setPixmap(). My image labels don't show on the GUI. I'll be abandoning this train of thought soon, either by downgrading to 4.5.3 or by staying with the dynamically linked 4.6.
静态编译以后的做法:
装QT SDK 后,默认采用的是动态链接库的编译方式,如果需要发布程序,需要在可执行的exe文件中添加必须的动态链接库,然而有些动态链接库文件很大,这并不是我们 想要的结果。
最好的办法是提交一个静态链接的程序。但是安装的Qt是动态编译的,要生成静态的版本,就需要自己重新进行编译。
首先需要修改位于<QTDIR>\mkspecs\win32-g++下的qmake.conf,在QMAKE_LFLAGS标签中增加-static。然后在“开始”菜单中运行Qt 4.4.3 Command Prompt程序,会启动一个命令行界面。再里面打入configure -static -release -no-exceptions。接受里面提到的许可之后,就会开始编译生成qmake并进行配置。配置完成以后,再输入mingw32-make sub-src。这样就开始对Qt进行编译,这步需要很长时间。
然后再像以前这样重新编译和生成自己写的程序,这样的生成的可执行程序就是使用静态链接的,可以直接在未安装Qt的电脑上运行。这样的副作用就是,可执行 文件变得非常大,有6.81MB!动态链接的版本只有82.5KB。当然,如果加上那些依赖的动态链接库,静态链接的程序在体积上还是有优势的
存在问题:只能使用realse版本,debug版本出问题。。
没有评论:
发表评论