本文仅用于记录此次编译细节,且此次编译目的仅在于生成MingGW-w64可用的Qt库,不追求编译尽可能多的库,不保证在其它机器上可用
脚本见文末
使用的MinGW-w64版本为x86_64-8.1.0-posix-sjlj-rt_v6-rev0,不过这个的版本影响不大
因为ActivePerl比较难下,所以用的是StrawberryPerl(后者占用空间更大)
最初用的是5.12.4,但是编译multimedia时出现error,之后在网上找到对应bug,且据说刚好在5.12.5当中被修复,索性弃用5.12,选用了目前的最高版本5.14.1
后来编译Qt3d时又出现error,仍然是-no-opengl的锅,索性跳过了大部分涉及绘图的库
据说只要不用QtDoc就不需要装LLVM,不过之前电脑上已经装过了,所以没有测试
按照资料编译了静态编译版的Qt,然而生成的文件仍然无法独立运行。后经检查生成静态编译版Qt的脚本中使用的仍然是-shared,应该将其改为-static
生成之后打开Qt Creator→工具→选项→Kits,在Qt Versions当中添加刚才生成的两个Qt,并在构建套件(Kit)当中进行相应配置,即可用于编译
最后生成的动态链接库占10G,静态链接库仅501MB;并且同一个程序(仅使用了QtGUI)动态链接仅占26KB,而静态链接版需要18MB
最终使用的批处理脚本(build.bat)如下
静态编译版:
需要修改
测试使用Qt 5.13.2,开源版,在src建立build.bat,去掉了quick3d -skip
@echo off rem ====================CONFIGURE BEFORE RUN SCRIPT!!====================== set QtSrcDir=%CD% set QtPrefixDir=C:\Qt\Qt5.14.1\5.14.1\mingw-w64_810-static set MingwDir=E:\mingw-w64\x86_64-8.1.0-posix-sjlj-rt_v6-rev0\mingw64 set BuildType=-release set QtSPEC=win32-g++ set LANG = en rem ======================================================================= PATH = %MingwDir%\bin;%MingwDir%\opt\bin;%SystemRoot%\system32;%SystemRoot% set FILE_TO_PATCH=%QtSrcDir%\qtbase\mkspecs\win32-g++\qmake.conf echo %FILE_TO_PATCH% if exist %FILE_TO_PATCH%.patched goto skipPatch type %FILE_TO_PATCH%>%FILE_TO_PATCH%.patched echo.>>%FILE_TO_PATCH% echo QMAKE_LFLAGS += -static -static-libgcc>>%FILE_TO_PATCH% echo QMAKE_CFLAGS_RELEASE -= -O2>>%FILE_TO_PATCH% echo QMAKE_CFLAGS_RELEASE += -Os -momit-leaf-frame-pointer>>%FILE_TO_PATCH% echo DEFINES += QT_STATIC_BUILD>>%FILE_TO_PATCH% :skipPatch set QT_INSTALL_PREFIX = %QtStaticDir% set OldDir=%CD% cd %QtSrcDir% cmd /C "configure.bat -static %BuildType% -platform %QtSPEC% -prefix %QtPrefixDir% -opensource -confirm-license -c++std c++14 -nomake examples -skip wayland -skip 3d -skip purchasing -skip scxml -skip speech -skip webengine -skip androidextras -skip gamepad -skip virtualkeyboard -skip datavis3d -skip macextras -skip networkauth -skip quick3d -skip sensors -skip declarative -skip lottie -skip webglplugin -skip charts -skip doc -skip script -skip location -no-opengl -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -no-openssl" if ERRORLEVEL 1 goto :error mingw32-make -r -k -s -j8 if ERRORLEVEL 1 goto :error mingw32-make -k install if ERRORLEVEL 1 goto :error set FILE_TO_PATCH=%QtPrefixDir%\mkspecs\win32-g++\qmake.conf echo.>>%FILE_TO_PATCH% echo CONFIG += static>>%FILE_TO_PATCH% echo ============BUILT!============ goto exitX :error echo ============ERROR!============ :exitX pause cd %OldDir%
动态编译版:
@echo off rem ====================CONFIGURE BEFORE RUN SCRIPT!!====================== set QtSrcDir=%CD% set QtPrefixDir=C:\Qt\Qt5.14.1\5.14.1\mingw-w64_810 set MingwDir=E:\mingw-w64\x86_64-8.1.0-posix-sjlj-rt_v6-rev0\mingw64 set BuildType=-debug-and-release set QtSPEC=win32-g++ set LANG = en rem ======================================================================= PATH = %MingwDir%\bin;%MingwDir%\opt\bin;%SystemRoot%\system32;%SystemRoot% set QT_INSTALL_PREFIX = %QtStaticDir% set OldDir=%CD% cd %QtSrcDir% cmd /C "configure.bat -shared %BuildType% -platform %QtSPEC% -prefix %QtPrefixDir% -opensource -confirm-license -c++std c++14 -nomake examples -skip wayland -skip 3d -skip purchasing -skip scxml -skip speech -skip webengine -skip androidextras -skip gamepad -skip virtualkeyboard -skip datavis3d -skip macextras -skip networkauth -skip quick3d -skip sensors -skip declarative -skip lottie -skip webglplugin -skip charts -skip doc -skip script -skip location -no-opengl -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -no-openssl" if ERRORLEVEL 1 goto :error mingw32-make -r -k -s -j8 if ERRORLEVEL 1 goto :error mingw32-make -k install if ERRORLEVEL 1 goto :error echo ============BUILT!============ goto exitX :error echo ============ERROR!============ :exitX pause cd %OldDir%