Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4489410
  • 博文数量: 192
  • 博客积分: 10014
  • 博客等级: 上将
  • 技术积分: 8232
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-21 00:22
文章分类

全部博文(192)

文章存档

2011年(4)

2009年(14)

2008年(174)

我的朋友

分类:

2011-02-28 20:24:56

静态编译?

或许有两个层次:

  • 编译出的程序不依赖 QtCore4.dll、QtGui4.dll 等 Qt 的静态库

  • 编译出的程序不依赖 msvcr90.dll、msvcp90.dll 等 C、C++ 的运行库

编译Qt

Qt 默认是动态编译的,下载Qt的源码,解压,而后运行(当系统中有多套编译环境时,需要通过platform参数指定所用编译环境 -platform win32-msvc2010)

configure -platform win32-msvc2010 -debug-and-release -opensource 
-static -fast -qt-sql-sqlite -plugin-sql-sqlite -no-qt3support  -qt-zlib
-qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -no-webkit
-qt-style-windowsxp -qt-style-windowsvista -nomake examples -nomake docs
-nomake demos 

然后运行 make 就进入漫长的等待了,结束后Qt编译就完成了。

运行 configure -h 可以得到详细的帮助信息,包括默认启用哪些参数等。

*  -shared ............ Create and use shared Qt libraries. 
-static ............ Create and use static Qt libraries.

这样将得到

  • QtCore.lib QtCored.lib 等静态库

而不是

  • QtCore4.lib QtCored4.lib 等导入库

  • QtCore4.dll QtCored4.dll 等动态库

去除C、C++运行库的依赖

通过 configure 的 -static 选项,我们可以编译出 Qt 的静态库,如果只是不想发布程序时发布Qt的动态库,这个已经完成了。

但是,它们仍依赖 C、C++ 的运行库。如果还想去除该依赖,需要在静态编译Qt之前手动修改

%QTDIR%\mkspecs\win32-msvc2010\qmake.conf

将 QMAKE_CFLAGS_RELEASE 和 QMAKE_CFLAGS_DEBUG 中的 -MD -MDd 分别修改为 -MT 和 -MTd 即可。 这4个参数的含义很容易通过

cl /?

得到

另外,还可以将 CONFIG 中的 embed_manifest_dll embed_manifest_exe 去掉(也可以不去掉)。

注意:对 qmake.conf 的修改最好放在运行 configure 之前,不然的话,修改后还需要手动运行

qmake -r

如何加快编译

编译 Qt,应该是一个比较费时费力费空间的。编译时有选择地去掉一些东西是比较合适的

  • 禁止编译不需要的模块,比如 Qt3Support,QtWebkit,等

    • 运行 configure -h 可以得到详细的参数列表
  • 禁止编译例子和demo,当系统中存在多套Qt时,编译例子确实不太需要,但 configure 没有相应的参数来禁止 demo 和 例子
    • 非windows系统下 configure 似乎支持 -nomake examples -nomake demos

    • 可以直接移除 demoes 和 examples 目录(移除肯定就不会编译了,但个人不喜欢这个)
    • 可以修改 Qt 根目录下的 projects.pro 文件
      • 方法一 注释掉 SUBDIRS += demos 这样的行

      • 方法二 直接修改 QT_BUILD_PARTS = libs tools examples demos docs translations

    • 可以修改 Qt 根目录下的 .qmake.cache 中的 QT_BUILD_PARTS

  • 运行完 configure 后,我们也可以通过运行
    make sub-src
    而不是
    make
    来避免编译非必须的东西
  • 编译完成后,运行
    make confclean
    来清理编译过程中的中间产物

插件问题

  • 动态编译时,插件似乎困扰不少人,经常有人抱怨,程序发布后,jpeg图片无法显示?中文显示乱码等等?
    • 解决方法很简单,发布时带上插件就行了(注意路径)
  • 当采用静态编译后,插件问题更严重了,为什么呢?插件都成静态库了,无法动态加载了(或许已不能被称为插件了)
    • 看 QtPlugin 的Manual,有关于静态插件的使用介绍

    • 看例子中 tools/plugandpaint 例子,使用的静态插件

常用插件

  • 图片插件 qgif qjpeg qico 等
  • 数据库 qsqlite 等
  • 东亚语言 qcncodecs 等
  • phonon 后端支持插件
  • QStyle 插件
  • ...

静态编译时插件的使用(比如,jpeg和gb2312的支持):

  • 在 cpp 文件(main.cpp)内添加语句

 

#include
Q_IMPORT_PLUGIN(qjpeg)
Q_IMPORT_PLUGIN(qcncodecs)
  • pro 文件内添加

 

QTPLUGIN += qjpeg qcncodecs

对与Mingw

采用 Mingw 静态编译Qt的步骤和上面基本一样(给configure传递 -static参数)。

再就是,修改

%QTDIR%\mkspecs\win32-msvc2005\qmake.conf

QMAKE_LFLAGS 添加 -static 选项

但是 MinGW 编译的程序会依赖下面的动态库

  • mingwm10.dll
  • libgcc_s_dw2-1.dll

对后libgcc这个库,似乎还好办,一种说法是修改 \qmake\Makefile.win32-* 中的

LFLAGS =

LFLAGS = -static-libgcc

这个我没试,Qt4.6.3中 LFLAGS 默认确实为空,但Qt4.7中默认已经添加了该选项

对与 mingwm10 这个动态库,似乎比较难办。因为它似乎和

  • 异常
  • 线程

有关。

参考

阅读(4602) | 评论(1) | 转发(0) |
0

上一篇:apache端口转发

下一篇:QT中文乱码的解决

给主人留下些什么吧!~~

chinaunix网友2011-03-06 09:12:21

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com