MinGW-w64編譯Qt5.14.1(含靜態編譯版本)雜記

(前前後後大概build了10次…)
參考資料:https://zhuanlan.zhihu.com/p/40271922

本文僅用於記錄此次編譯細節,且此次編譯目的僅在於生成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)如下
靜態編譯版:

@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%

2020.03.12

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章