静态编译包含OpenSSL和MySQL的QT

配置开发环境

  1. 编译器GCC >= 4.9或者Visual Studio >= 2012,开发工具Perl >= 5.12
  2. 编译QtWebEngine需要Python >= 2.7.5
  3. QDoc从QT 5.11开始使用Clang解析C++代码,构建QDoc文档需要Clang

使用MinGW静态编译

使用在上篇文章中MinGW静态编译的OPENSSL和MariaDB,并把生成的内容分别复制到D:\Qt\LIB\openssl和D:\Qt\LIB\mysql下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 设置MinGW的开发环境
set PATH=D:\Qt\Qt5.12.5\Tools\mingw730_64\bin;D:\Qt\DevTools\Python27;D:\Qt\DevTools\perl\perl\bin;%PATH%
set LLVM_INSTALL_DIR=D:\Qt\DevTools\LLVM-9.0.0-win64 # Clang根目录而不是bin目录

cd D:\Qt\qt-everywhere-src-5.12.5\
mkdir build & cd build

..\Configure.bat -confirm-license -opensource -platform win32-g++ -debug-and-release -static -prefix "D:\Qt\Qt5.12.5_MinGW_Static" MYSQL_INCDIR="D:\Qt\LIB\mysql\include\mariadb" MYSQL_LIBDIR="D:\Qt\LIB\mysql\lib" -L "D:\Qt\LIB\openssl\lib" MYSQL_LIBS="-lmariadbclient -lssl -lcrypto -lws2_32 -lgdi32 -luser32 -lwsock32 -ladvapi32 -lcrypt32" OPENSSL_INCDIR="D:\Qt\LIB\openssl\include" OPENSSL_LIBDIR="D:\Qt\LIB\openssl\lib" OPENSSL_LIBS="-lssl -lcrypto -lws2_32 -lgdi32 -ladvapi32 -lcrypt32 -luser32 -lz" -qt-sqlite -sql-mysql -openssl-linked -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -qt-pcre -qt-harfbuzz -no-qml-debug -no-angle -nomake tests -nomake examples -skip qtwebengine -skip wayland

# 友好阅读排列,正常执行上面那句即可
..\Configure.bat -confirm-license -opensource -platform win32-g++ -debug-and-release -static -prefix "D:\Qt\Qt5.12.5_MinGW_Static" \
MYSQL_INCDIR="D:\Qt\LIB\mysql\include\mariadb" MYSQL_LIBDIR="D:\Qt\LIB\mysql\lib" -L "D:\Qt\LIB\openssl\lib" \
MYSQL_LIBS="-lmariadbclient -lssl -lcrypto -lws2_32 -lgdi32 -luser32 -lwsock32 -ladvapi32 -lcrypt32" \
OPENSSL_INCDIR="D:\Qt\LIB\openssl\include" OPENSSL_LIBDIR="D:\Qt\LIB\openssl\lib" \
OPENSSL_LIBS="-lssl -lcrypto -lws2_32 -lgdi32 -ladvapi32 -lcrypt32 -luser32 -lz" \
-qt-sqlite -sql-mysql -openssl-linked -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -qt-pcre -qt-harfbuzz \
-no-qml-debug -no-angle -nomake tests -nomake examples -skip qtwebengine -skip wayland

mingw32-make -j12 # 需要80分钟,build目录下共占用了14.8G大小
mingw32-make install # 需要12分钟,安 装目录下共占用了6.95G大小

使用MSVC静态编译

OpenSSL静态库 | MYSQL,下载这两个静态库,并把里面的内容分别复制到D:\Qt\VS14\openssl\和D:\Qt\VS14\mysql下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 设置MSVC的开发环境
cd C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\
vcvarsall.bat amd64 # 选择架构:x86 amd64 amd64_x86
set PATH=D:\Qt\DevTools\Python27;D:\Qt\DevTools\perl\perl\bin;%PATH%
set LLVM_INSTALL_DIR=D:\Qt\DevTools\LLVM-9.0.0-win64 # Clang根目录而不是bin目录

cd D:\Qt\qt-everywhere-src-5.12.5\
mkdir build & cd build

..\Configure.bat -confirm-license -opensource -platform win32-msvc -mp -debug-and-release -static -prefix "D:\Qt\Qt5.12.5_VS14_Static" MYSQL_INCDIR="D:\Qt\VS14\mysql\include" MYSQL_LIBDIR="D:\Qt\VS14\mysql\lib" MYSQL_LIBS="-lmysqlclient -lGdi32 -lAdvapi32 -lUser32 -lCrypt32" OPENSSL_INCDIR="D:\Qt\VS14\openssl\include" OPENSSL_LIBDIR="D:\Qt\VS14\openssl\lib" OPENSSL_LIBS="-llibssl_static -llibcrypto_static -lws2_32 -lGdi32 -lAdvapi32 -lUser32 -lCrypt32" -qt-sqlite -sql-mysql -openssl-linked -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -qt-pcre -qt-harfbuzz -no-qml-debug -no-angle -nomake tests -nomake examples -skip qtwebengine -skip wayland

# 友好阅读排列,正常执行上面那句即可
..\Configure.bat -confirm-license -opensource -platform win32-msvc -mp -debug-and-release -static -prefix "D:\Qt\Qt5.12.5_VS14_Static" \
MYSQL_INCDIR="D:\Qt\VS14\mysql\include" MYSQL_LIBDIR="D:\Qt\VS14\mysql\lib\vs14" \
MYSQL_LIBS="-lmysqlclient -lGdi32 -lAdvapi32 -lUser32 -lCrypt32" \
OPENSSL_INCDIR="D:\Qt\VS14\openssl\include" OPENSSL_LIBDIR="D:\Qt\VS14\openssl\lib" \
OPENSSL_LIBS="-llibssl_static -llibcrypto_static -lws2_32 -lGdi32 -lAdvapi32 -lUser32 -lCrypt32" \
-qt-sqlite -sql-mysql -openssl-linked -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -qt-pcre -qt-harfbuzz \
-no-qml-debug -no-angle -nomake tests -nomake examples -skip qtwebengine -skip wayland

# nmake可以指定-mp参数使用CPU的线程数进行多线程编译
# jom功能与nmake基本一致,不同点是它可以自定义线程数(jom -j12 & jom install)
nmake # 需要125分钟,build目录下共占用了22.2G大小
nmake install # 需 要11分钟,安 装目录下共占用了3.54G大小

其他问题

  1. 一定要链接路径D:\Qt{LIB|VS14}\mysql\lib和D:\Qt{LIB|VS14}\openssl\lib里面的静态库,链接了动态库会报错

  2. 注意32位的编译器不能用64位的库,否则会报错。-sql-mysql代表直接链接,-plugin-sql-mysql作为插件构建

  3. 添加Qt库时报qmlscene未安装的警告,复制动态库中的bin/qmlscene.exe和相关DLL到静态库的bin文件夹中即可

  4. 在Qt Creator中使用MinGW静态编译的QT库,Visual Studio中使用请自行搜索

1
2
添加Qt版本:工具 -> 选项 -> 构件和运行(Kits) -> Qt Versions -> 添加 -> D:\Qt\Qt5.12.5_MinGW_Static\bin\qmake.exe -> 版本名称:Qt %{Qt:Version} (Qt5.12.5_MinGW_Static) -> Apply 
设置到套件:工具 -> 选项 -> 构件和运行(Kits) -> 构建套件(Kits) -> 添加 -> 名称:Desktop Qt %{Qt:Version} MinGW 64-bit Static -> Qt Version:Qt5.12.5 (Qt5.12.5_MinGW_Static) -> Apply
  1. 如果软件使用MinGW静态编译后如果还是需要 libgcc_s_xxx.dll 等库,将如下文件修改或添加两行参数即可解决:
1
2
3
4
5
# QT源码编译前:将这个文件添加如下两行:D:\Qt\qt-everywhere-src-5.12.5\qtbase\mkspecs\win32-g++\qmake.conf 
# 该程序编译前:将这个文件添加如下两行:D:\Qt\Qt5.12.5_MinGW_Static\mkspecs\win32-g++\qmake.conf

QMAKE_LFLAGS = -static
QMAKE_LFLAGS_DLL = -static
  1. 如果软件使用MSVC静态编译后如还是显示需要 xxx.dll 等库,则将如下文件修改或添加两行参数即可解决:
1
2
3
4
5
6
# QT源码编译前:修改这个文件如下两行:D:\Qt\qt-everywhere-src-5.12.5\qtbase\mkspecs\common\msvc-desktop.conf 
# 该程序编译前:修改这个文件如下两行:D:\Qt\Qt5.12.5_VS14_Static\mkspecs\common\msvc-desktop.conf

QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_OPTIMIZE -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MT
QMAKE_CFLAGS_DEBUG = -Zi -MTd

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 新建文件或项目 -> Non-Qt Project -> Plain C++ Application 
// 记得构建套件选择 Desktop Qt 5.12.5 MinGW 64-bit Static 构建,否则还是动态链接
// 在.pro文件中添加QT += sql

// main.cpp
#include <QCoreApplication>
#include <QDebug>
#include <QSqlDatabase>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << QSqlDatabase::drivers();
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("HostName");
db.setDatabaseName("DatabaseName");
db.setUserName("UserName");
db.setPassword("Password");
db.setPort(3306);

if (db.open())
qDebug() << "连接数据库成功";
else
qDebug() << "连接数据库失败";

return a.exec();
}