起因
想要发布一个 Qt 小软件,但不得不附带一批动态链接库是件不爽的事情。以前介绍过一种方法,将动态链接库打包到可执行程序文件中去,实现单文件化(Qt 之可执行文件单文件化)。目的虽然达到了,但很有可能被某些杀毒软件、某某管家之类的给识别成病毒、木马,还是不爽☹️
Qt 静态库
按照 LGPL 许可的要求,如果要闭源,只能使用 Qt 的动态链接库。如果你的软件是开源的,还是可以使用 Qt 静态库的。
准备原材料
编译 Qt 静态库(或者说是工具包 Tool Kit),首先要有原材料和工具。他们可以从 Qt 的安装包获取,也可以在网上单独下载。在安装 Qt 的时候选上 Source Components (这是源码)和 Tools/MinGW (这是编译工具):
搭建编译环境
MinGW 不用说了,编译 C++ 没有他可不行。此外一般还要用到 Python 和 Perl。
下载并安装 Python2
https://www.python.org/downloads/
下载并安装 Perl
http://www.activestate.com/activeperl/downloads
配置系统环境变量 Path
Python 和 Perl 在安装的时候都可以选择自动加入到 Path 中。此外,还要把 mingw32-make.exe 及编译器的路径也加进 Path 变量:
C:\Perl\bin;
C:\Python27\;
C:\Qt\Qt5.6.0\Tools\mingw492_32\bin;
注意:改完后别忘记重启一下使 Path 生效,不然又得半途而废,重新编译了!
配置
在配置前修改 C:\Qt\Qt5.6.0\5.6\Src\qtbase\mkspecs\win32-g++\qmake.conf :
QMAKE_LFLAGS 加上 -static
QMAKE_LFLAGS_DLL 中的 -shared 改为 -static
似乎在编译、安装完成以后再改也一样(改安装后的 qmake.conf ),不改的话执行生成的软件时还会提示缺 libgcc_s_dw2-1.dll 。
好了,进入源码根目录:
cd C:\Qt\Qt5.6.0\5.6\Src
执行配置命令:
configure -opensource -confirm-license -static -release -platform win32-g++ -prefix "C:\Qt\static\5.6.0" -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -opengl desktop -qt-sql-sqlite -no-openssl -make libs -nomake tools -nomake examples -nomake tests
配置参数的含义,请参阅:
http://doc.qt.io/qt-5/configure-options.html
这一步的作用是生成静态的 qmake ,并用此 qmake 生成 qt.pro 的 makefile 。
漫长的编译过程来了
接下来就是要用静态 qmake 和 mingw32-make 根据前面生成的这个 makefile 文件来生成各子工程的 makefile ,并根据 makefile 编译、连接,生成静态库或可执行程序了。
执行命令:
mingw32-make
干脆睡一觉吧...
在 rMBP15 上用 PD11 搭建的 Win10 虚拟机上,大概两个半小时后完成了编译。
如果要重新配置和 make ,先执行这个的命令:
mingw32-make confclean
make 后就可以安装了,执行命令:
mingw32-make install
mingw32-make 将静态库安装在了 -prefix "C:\Qt\static\5.6.0"
定义的位置。
配置 Qt Creator
打开 Qt Creator ,菜单栏点击工具 -> 选项 -> 构建和运行 -> Qt Version ,添加 qmake 。
在构建套件选项卡中的 Qt Version 中选中刚才新建的 Qt Version 。
在项目新建向导中的 Kit Selection 可以看到工具包了。
好了,生成一个单 exe 软件拷贝到没有安装 Qt 运行环境的电脑上试试看吧。
如何编译并添加第三方静态库
以 QtXlsx (一个操作 Excel 的库,详情看这里)为例来说明。编译器仍然使用前文说到的 mingw32 ,这没有什么异议。需要注意的是 qmake 要使用我们编译好的静态版的,而不是安装时自带的动态版的。
配置系统变量 Path ,构建并安装:
set path=C:\Qt\static\5.6.0\bin;C:\Qt\Qt5.5.0\Tools\mingw492_32\bin;%path%
qmake
mingw32-make docs install
参考资料
Building a static Qt for Windows using MinGW : http://wiki.qt.io/Building_a_static_Qt_for_Windows_using_MingW
Qt Configure Options : http://doc.qt.io/qt-5/configure-options.html