Qt发布(一) ------ 静态编译解决Qt安装包大小问题

    Qt在Windows开发中比较重要的一个问题就是,发布的时候会带上一大堆插件+自己的dll,即使是最简单的helloworld发布,至少也得带上QWidget+QtCore,外加Windowsplatform的plugin(Qt4没有platform的插件,但是有QtGui),简单的一个demo就得接近20M。更何况实际工程之中往往会用到一些更占据体积的模块,比如Webkit(这个原生的webkit依赖奇多,因为要增加对qml的支持,所以链接了包括网络+qml+基础QWidget模块在内的所有模块。其实,有些网络模块和qml模块一般是不会用到的,增加了依赖的同时也增加了体积)

    解决这种常规模块(qt源代码目录下qtbase中的模块,我称之为常规模块,大部分不需要特殊的三方依赖即可编译)的编译大小问题,就是configure的选项调整成了Qt静态编译,然后使用qt静态编译的lib进行编译链接,这样链接出来的可执行文件会比原来使用动态dll的方法总体积小上很多。

    整体过程大致如下:

  1. 先下载对应的qt-everywhere-opensource包,下载完毕之后使用管理员权限cmd进入源码目录,输入如下:
        configure -static -release -desktop opengl -skip qtdoc -skip qtwebkit -nomake examples(这里可以用-debug-and-release,但是debug生成的体积十分大,浪费硬盘而且没啥用,可以不生成, 跳过examples生成步骤会极大的节省编译时间和硬盘占用,examples主要是Qt自带的例子程序,作为开发参考,就和WinAPI和MSDN关系类似,到用的时候再去查就好了)。
    (Qt4和Qt5配置项目这里会不太一样,这里的是Qt4,Qt5可以参考:configure -release -static -platform win32-msvc2013 -opengl desktop -qt-s
    ql-sqlite -qt-zlib -qt-style-windowsvista -qt-libpng -qt-libjpeg -nomake demos -nomake examples

  2. 这里mingw和VS会不太一样,VS需要修改对应版本下的的makespec下面的MD改到MT,MDd改到MTd,这个网上关于VS编译有自己的资料可查。mingw什么都不用改。(这里Qt5的话已经没有了makespec所以这里不用再设置)。

  3. 然后到在用各自编译环境的命令行重定向到源码目录下,开始编译(一个输入),qt5只编译qtbase的话,还是比较迅速的。各自make,然后qtbase的静态库就会生成在qtbase目录下的lib目录下。然后可以make install,然后就是include+静态lib就可以组成一个开发环境了。就和使用其他第三方库一样使用qt即可。

  4. 静态编译之后,所有插件静态加载,Windows的platform插件名字是QWindowsIntegrationPlugin,至于各个插件的名字均可以在源代码qtbase/plugins/下对应工程项目文件(.pro)中找到对应的插件名字。 然后在代码中使用QT_PLUGIN_IMPORT(插件名字)宏导入
        静态编译之后,lib依赖会变多,这个一般看对应缺失符号的类名前缀即可察觉到缺少链接的lib是哪些。

  5. 经过静态编译过后,qt5的动态资源文件rcc加载会出现问题,不能自动生成打包到exe里面,此时需要用QResource::register(“XXXX.rcc”)来注册对应的资源,才可以使用(这个rcc必须是外部的单独文件才可以注册)。这里就会出现rcc资源文件独立于exe的问题。可以通过Windows的rc file自定义资源文件系统解决,解出资源放置在exe目录然后register资源rcc,就是在最好在实例化QApplication之前需要解出资源rcc,然后实例化QApplication注册资源。这样就可以保证只有一个exe发布,没有其他的dll和多余文件等。

你可能感兴趣的:(Qt)