Qt 5.7.1/5.8.0/5.9.0 在 msvc2015/mingw32 方式下的静态编译过程

 

注:Qt5.9.0的操作过程除configure参数之外与5.8.0基本一致(mingw版5.9.0的qmake.conf文件中QMAKE_LFLAGS            = -static这一行需要手动添加)。

准备工作:

1. 在Qt官网下载Qt库的源码。

 

            Qt 5.7.1: https://download.qt.io/archive/qt/5.7/5.7.1/single/

            Qt 5.8.0: https://download.qt.io/archive/qt/5.8/5.8.0/single/

Qt 5.7.1/5.8.0/5.9.0 在 msvc2015/mingw32 方式下的静态编译过程_第1张图片

         Qt 5.7.1/5.8.0/5.9.0 在 msvc2015/mingw32 方式下的静态编译过程_第2张图片

2. 下载并安装Python。https://www.python.org/downloads/

3. 下载并安装Perl。https://www.perl.org/

4. 下载并安装Ruby。http://www.ruby-lang.org/en/downloads/

 

注意:① 下载Ruby时选择安装包版本。

            ② 安装Python,Perl,Ruby时要注意勾选添加环境变量到系统。

            ③ 检测三个环境是否安装好,打开cmd窗口:

                Python的检测:Python

                Perl的检测:Perl -v

                Ruby的检测:Ruby -v

 

第一步:配置Qt的Makefile文件

1. 将下载的qt源码解压后,放在硬盘的根目录。例如:C:\qt_5.7.1_src

 

注:如果qt源码目录的路径比较长会导致编译qtimageformats时出现 无法打开编译器生成的文件“”:Invalid argument的错误,所以放在根目录下,尽量减少路径长度。

 

2. msvc版本:

 

            修改源码中\qtbase\mkspecs\common\msvc-desktop.conf文件,

 

           QMAKE_CFLAGS_RELEASE    = -O2 -MD
           QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi
           QMAKE_CFLAGS_DEBUG      = -Zi -MDd

 

           改为:

 

           QMAKE_CFLAGS_RELEASE    = -O2 -MT
           QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi
           QMAKE_CFLAGS_DEBUG      = -Zi -MTd

 

mingw版本:

            修改源码中\qtbase\mkspecs\win32-g++\qmake.conf文件,

 

            QMAKE_LFLAGS            = 
            QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads
            QMAKE_LFLAGS_EXCEPTIONS_OFF =
            QMAKE_LFLAGS_RELEASE    = -Wl,-s
            QMAKE_LFLAGS_DEBUG      =
            QMAKE_LFLAGS_CONSOLE    = -Wl,-subsystem,console
            QMAKE_LFLAGS_WINDOWS    = -Wl,-subsystem,windows
            QMAKE_LFLAGS_DLL        = -shared

 

            改为:

 

             QMAKE_LFLAGS            = -static
            QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads
            QMAKE_LFLAGS_EXCEPTIONS_OFF =
            QMAKE_LFLAGS_RELEASE    = -Wl,-s
            QMAKE_LFLAGS_DEBUG      =
            QMAKE_LFLAGS_CONSOLE    = -Wl,-subsystem,console
            QMAKE_LFLAGS_WINDOWS    = -Wl,-subsystem,windows
            QMAKE_LFLAGS_DLL        = -static

 

注:Qt 5.8.0中有一个cpp文件(qtbase\src\plugins\generic\tuiotouch\qtuiohandler.cpp)包含了非ASCII字符,需要用notepad++另存一个带BOM的UTF-8编码文件,替换原文件。

 

3. msvc版:

            打开VS自带的命令提示窗口:

            

 

            注:如果是编译x64的Qt,则需要打开VS2015 x64 本机工具命令提示符:

            Qt 5.7.1/5.8.0/5.9.0 在 msvc2015/mingw32 方式下的静态编译过程_第3张图片

 

mingw版:

           打开mingw32版Qt附带的命令行工具:

           Qt 5.7.1/5.8.0/5.9.0 在 msvc2015/mingw32 方式下的静态编译过程_第4张图片

 

注意:MinGW下静态编译后库会依赖MinGW中的某些库,库所在的绝对路径会写入到Qt库的prl文件中。所以建议在Qt中拷贝MinGW编译器文件夹到C:\MinGW7.3.0\下,然后新建bat文件内容如下(64位需要做对应修改):

@echo off
set PATH=C:\MinGW7.3.0\mingw730_32\bin;%PATH%

然后通过在cmd中运行这个bat,来代替此步。

4. 通过cd命令进入qt源码目录:cd C:\qt_5.7.1_src

 

注:如果源码不在系统盘,则需要先用“盘符:”命令进入所在分区,如"D:"、"cd D:\qt_5.7.1_src"就进入了D盘的源码目录。

 

5. 输入Configure命令:

 

Qt 5.7.1:

 

configure -confirm-license -opensource -debug-and-release -static -force-debug-info -prefix "D:\msvc2015_static" -qt-sql-sqlite -qt-sql-odbc -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -no-qml-debug -no-angle -nomake tests -nomake examples

 

Qt 5.8.0:

 

configure -confirm-license -opensource -debug-and-release -static -force-debug-info -prefix "E:\msvc2015_static" -qt-sqlite -qt-pcre -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -nomake tests -nomake examples

 

Qt 5.9.0(msvc版)

 

configure -confirm-license -opensource -platform win32-msvc -debug-and-release -static -static-runtime -force-debug-info -opengl dynamic -prefix "E:\msvc2015_static" -qt-sqlite -qt-pcre -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -nomake tests -no-compile-examples -nomake examples


Qt 5.9.0(mingw版)

 

 

configure -confirm-license -opensource -platform win32-g++ -debug-and-release -static -static-runtime -force-debug-info -opengl dynamic -prefix "E:\mingw53_32_static" -qt-sqlite -qt-pcre -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype -nomake tests -no-compile-examples -nomake examples

 

 

 

注:-prefix后跟的是编译完成后的安装目录,替换成自己的目录即可。

       如果需要包含OpenSSL,则先静态编译OpenSSL,然后将编译的安装目录放到C:\QtStaticLibs\OpenSSL,然后在configure中间插入-openssl-linked OPENSSL_PREFIX=C:\QtStaticLibs\OpenSSL OPENSSL_LIBS="-lssleay32 -llibeay32 -lgdi32"(MinGW下是OPENSSL_LIBS="-llibssl -llibcrypto -lgdi32")

注意:Qt 5.12.1之后,OPENSSL_LIBS="-llibeay32 -lssleay32 -lgdi32 -luser32 -lwsock32 -ladvapi32";MinGW下是OPENSSL_LIBS="-llibssl -llibcrypto -lgdi32 -luser32 -lwsock32 -ladvapi32 -lcrypt32"

       如果需要包含MySQL,则先安装 MySQL C Connector,然后将库目录放到C:\QtStaticLibs\MySQL,然后在configure中间插入-sql-mysql MYSQL_PREFIX=C:\QtStaticLibs\MySQL

 

注意:(此步骤非必须,MinGW也可以识别.lib)MinGW方式下 libmysql.lib 需要先转换成 libmysql.a 和 libmysql.def,使用MinGW的reimp:

reimp -d libmysql.lib
dlltool -k -d libmysql.def -l libmysql.a

 

msvc版:

 

            执行完成后会提示nmake:

            Qt 5.7.1/5.8.0/5.9.0 在 msvc2015/mingw32 方式下的静态编译过程_第5张图片

mingw版:

            

 

 

第二步:编译Qt库

1.msvc版: 

            执行nmake命令:

            Qt 5.7.1/5.8.0/5.9.0 在 msvc2015/mingw32 方式下的静态编译过程_第6张图片

2.mingw版:

            执行mingw32-make命令:

            

 

注:此步大约会执行2~3小时。

 

2. 执行结束后没有报错说明编译成功,接下来安装到指定目录。

msvc版:执行nmake install命令。

mingw版:执行mingw32-make install。

 

注:此步大约执行10~20分钟。

3. 执行完成后没有报错说明安装成功,D:\msvc2015_static文件夹中即为最终的qt库。

 

第三步:配置Qt库

1. qt.conf文件指明qt库目录的前缀、文档目录和示例目录,如果将安装目录挪到别处则需要修改或新建。在bin文件夹下新建qt.conf文件,并输入以下内容:

 

[Paths]
Documentation=C:/Qt/Qt5.7.1/Docs/Qt-5.7
Examples=C:/Qt/Qt5.7.1/Examples/Qt-5.7
Prefix=D:/msvc2015_static


注:① 文档和示例目录此处使用了官方的msvc2015动态编译版安装包中的目录,也可以删掉这两项。Prefix是存放Qt库的目录。

 

        ② 建议把静态的Qt库和动态的Qt库放在同一目录,这样可以直接复制动态Qt库目录下的qt.conf文件,或输入以下内容:

 

[Paths]
Documentation=../../Docs/Qt-5.7
Examples=../../Examples/Qt-5.7
Prefix=..

 

2. 复制动态库中的bin/qmlscene.exe到静态库的bin文件夹中。否则在Qt Creator中添加Qt库时会报qmlscene未安装的错误。

 

 

3. 此步是Qt 5.7.1的msvc版需要执行的步骤:从源码目录中复制pdb文件到安装目录的lib文件夹。

将下面文本复制到批处理文件中,然后放在lib文件夹中执行:

 

for /r C:\qt_5.7.1_src %%a in (*.pdb) do if /i "%%~xa"==".pdb" copy "%%~a"

pause

 

有些pdb文件不是放在lib文件夹的,此时需要按照pdb的名字进行搜索,将同名的pdb和lib放在一起。

最后删除批处理文件。

 

注:① 如果不执行此步,编译时会有“未找到PDB文件”的警告,且调试时无法跟踪到Qt的源码。

 

4. 从动态链接版的Qt库的bin文件夹中复制Qt5Core.dll到静态链接版的lib文件夹中。

 

注:① 如果不执行此步,在Creator的Qt Version中将会显示“x86-windows-unknown-pe-32bit”。

        ②实测Qt 5.12.1已经不需要此步。

第四步:配置Qt Creator

1. 添加Qt Versions:

Qt 5.7.1/5.8.0/5.9.0 在 msvc2015/mingw32 方式下的静态编译过程_第7张图片

 

2. 新建一个构建套件,Qt版本选择刚添加的静态版,其他选项与动态版相同即可。

Qt 5.7.1/5.8.0/5.9.0 在 msvc2015/mingw32 方式下的静态编译过程_第8张图片

 

 

你可能感兴趣的:(Qt)