1. 首页
  2. 开发
  3. C/C++

MinGW-w64编译Qt 静态版本(含静态编译版本)杂记

本文仅用于记录此次编译细节,且此次编译目的仅在于生成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%

 

原创文章,作者:admin,如若转载,请注明出处:https://www.huiyingwu.com/4426/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注