0%

在Windows 环境下编译Qt静态库

安装MinGW工具链环境

  • 这里在Win32环境下要安装一个MinGW工具链,这里最好是先安装一个Qt环境,使用Qt自带的MinGW工具链,我这里是先安装一个Qt5.6的环境再用它来编译Qt5.3.2的静态库.下载并安装ActivePerl软件.

  • 这里要用到MSYS环境,把编译ICU,opensslgcc都指向QT5.6.1自带的工具链GCC,这样才能保能Qt,ICU,openssl编译出来的C++二进制文是兼容的,修改msys_env.bat脚本如下:

    1
    2
    3
    4
    set path=C:\Python27;C:\Perl\bin;C:\Qt\Qt5.6.1\Tools\mingw492_32\bin;D:\mingw\bin;
    D:\mingw\mingw32\bin;D:\mingw\msys\1.0\bin
    set HOME=D:\mingw\msys\1.0
    bash.exe
  • 修改fstab文件,这里从StackOverFlow
    看到解释

1
2
C:/Qt/Qt5.6.1/Tools/mingw492_32  /mingw
c:/perl/Perl

下载ICU

下载编译ICU

  • 下载ICU4C_53_1
  • 这里以icu-53_1为例编译 解压ICU包进入到source目录
1
2
3
4
5
bash.exe-3.1$ cd icu/source
bash.exe-3.1$ ./runConfigureICU MinGW --prefix=/c/icu4c53_1 --enable-static --disable-shared
--enable-release --disable-debug
[...]
bash.exe-3.1$ make && make install

编译openssl

  • 下载 https://www.openssl.org/source/openssl-1.0.1g.tar.gz
  • 编译openssl 必需要有msys环境.请仔细查看解压后文件夹里的INSTALL.W32文档.
  • 运行msys shell ,切换的openssl-1.0.1g目录下:
    1
    2
    3
    4
    5
    6
    7
    bash.exe-3.1$  ./config --prefix=/c/openssl-1.0.1g no-asm no-shared
    [...]
    bash.exe-3.1$ make depend
    [...]
    bash.exe-3.1$ make
    [...]
    bash.exe-3.1$ make install

编译Qt源码

  • 下载Qt5.3.2
  • 解压文件并且修改qtbase\mkspecs\win32-g++\qmake.conf最终文件如下:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    # qmake configuration for win32-g++
    #
    # Written for MinGW / gcc 4.6 or higher
    #
    # Cross compile example for i686-w64-mingw32-g++:
    # configure -xplatform win32-g++ -device-option CROSS_COMPILE=i686-w64-mingw32-
    #
    load(device_config)
    MAKEFILE_GENERATOR = MINGW
    QMAKE_PLATFORM = win32 mingw
    CONFIG += debug_and_release debug_and_release_target precompile_header
    DEFINES += UNICODE
    QMAKE_COMPILER_DEFINES += __GNUC__ WIN32
    QMAKE_EXT_OBJ = .o
    QMAKE_EXT_RES = _res.o
    QMAKE_COMPILER = gcc
    QMAKE_CC = $${CROSS_COMPILE}gcc
    QMAKE_LEX = flex
    QMAKE_LEXFLAGS =
    QMAKE_YACC = byacc
    QMAKE_YACCFLAGS = -d
    QMAKE_CFLAGS = -pipe -fno-keep-inline-dllexport
    QMAKE_CFLAGS_DEPS = -M
    QMAKE_CFLAGS_WARN_ON = -Wall -Wextra
    QMAKE_CFLAGS_WARN_OFF = -w
    QMAKE_CFLAGS_RELEASE -= -O2
    QMAKE_CFLAGS_RELEASE += -Os -momit-leaf-frame-pointer #注意这一行
    QMAKE_CFLAGS_DEBUG = -g
    QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
    QMAKE_CFLAGS_SPLIT_SECTIONS = -ffunction-sections
    QMAKE_CFLAGS_SSE2 = -msse2 -mstackrealign
    QMAKE_CFLAGS_SSE3 = -msse3
    QMAKE_CFLAGS_SSSE3 = -mssse3
    QMAKE_CFLAGS_SSE4_1 = -msse4.1
    QMAKE_CFLAGS_SSE4_2 = -msse4.2
    QMAKE_CFLAGS_AVX = -mavx
    QMAKE_CFLAGS_AVX2 = -mavx2
    QMAKE_CFLAGS_IWMMXT = -mcpu=iwmmxt
    QMAKE_CFLAGS_NEON = -mfpu=neon
    QMAKE_CXX = $${CROSS_COMPILE}g++
    QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
    QMAKE_CXXFLAGS_DEPS = $$QMAKE_CFLAGS_DEPS
    QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
    QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
    QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE
    QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG
    QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
    QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
    QMAKE_CXXFLAGS_RTTI_ON = -frtti
    QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti
    QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
    QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
    QMAKE_CXXFLAGS_CXX11 = -std=c++0x
    QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS
    QMAKE_INCDIR =
    QMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
    QMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
    QMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
    QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
    QMAKE_LINK = $${CROSS_COMPILE}g++
    QMAKE_LINK_C = $${CROSS_COMPILE}gcc
    QMAKE_LFLAGS = -static -static-libgcc # 添加这一行
    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
    QMAKE_LFLAGS_CXX11 =
    QMAKE_LFLAGS_GCSECTIONS = -Wl,--gc-sections
    QMAKE_LINK_OBJECT_MAX = 10
    QMAKE_LINK_OBJECT_SCRIPT = object_script
    QMAKE_PREFIX_STATICLIB = lib
    QMAKE_EXTENSION_STATICLIB = a
    QMAKE_LIBS =
    QMAKE_LIBS_CORE = -lole32 -luuid -lws2_32 -ladvapi32 -lshell32 -luser32 -lkernel32
    QMAKE_LIBS_GUI = -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lws2_32 -lole32 -luuid -luser32 -ladvapi32
    QMAKE_LIBS_NETWORK = -lws2_32
    QMAKE_LIBS_OPENGL = -lglu32 -lopengl32 -lgdi32 -luser32
    QMAKE_LIBS_OPENGL_ES2 = -llibEGL -llibGLESv2 -lgdi32 -luser32
    QMAKE_LIBS_OPENGL_ES2_DEBUG = -llibEGLd -llibGLESv2d -lgdi32 -luser32
    QMAKE_LIBS_COMPAT = -ladvapi32 -lshell32 -lcomdlg32 -luser32 -lgdi32 -lws2_32
    QMAKE_LIBS_QT_ENTRY = -lmingw32 -lqtmain
    !isEmpty(QMAKE_SH) {
    MINGW_IN_SHELL = 1
    QMAKE_DIR_SEP = /
    QMAKE_DIRLIST_SEP = :
    include(../common/shell-unix.conf)
    # Because install's ability to set permissions is not relevant on Windows,
    # and git's msys does not provide it to start with.
    QMAKE_INSTALL_FILE = cp -f
    QMAKE_INSTALL_PROGRAM = cp -f
    } else {
    include(../common/shell-win32.conf)
    }
    QMAKE_IDL = midl
    QMAKE_LIB = $${CROSS_COMPILE}ar -ru
    QMAKE_RC = $${CROSS_COMPILE}windres
    QMAKE_STRIP = $${CROSS_COMPILE}strip
    QMAKE_STRIPFLAGS_LIB += --strip-unneeded
    QMAKE_OBJCOPY = $${CROSS_COMPILE}objcopy
    QMAKE_NM = $${CROSS_COMPILE}nm -P
    load(qt_config)

创建编译脚本

  • 创建一个bat的脚本件内容如下,有些变量请按实际系统环境做相应的修改.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
set RDIR=c:/Qt/Qt5.6.1
set VERGCC=mingw492_32
set PATH=C:/Python27;C:/Perl/bin;%RDIR%/5.6/%VERGCC%/bin;%RDIR%/Tools/%VERGCC%/bin;C:\icu\bin;%RDIR%/Tools/QtCreator/bin
set INCLUDE=%RDIR%/5.6/%VERGCC%/include;%RDIR%/Tools/%VERGCC%/include;C:\icu4c53_1\include;C:\openssl-1.0.1g\include
set LIB=%RDIR%/5.6/%VERGCC%/lib;%RDIR%/Tools/%VERGCC%/lib;C:\icu4c53_1\lib;C:\openssl-1.0.1g\lib
set SDIR=D:/qt-everywhere-opensource-src-5.3.2
cd %SDIR%
configure.bat -mp -platform win32-g++ -opensource -confirm-license -release
-static -ltcg -c++11 -prefix "c:/Qt/5.3.2-static" -accessibility
-rtti -qt-sql-sqlite -qt-sql-odbc -plugin-sql-sqlite -plugin-sql-odbc -icu -qt-zlib -qt-libpng -qt-libjpeg
-audio-backend -opengl desktop -qml-debug -no-vcproj -no-dbus -nomake tests
-openssl -I C:/openssl-1.0.1g/include -L C:/openssl-1.0.1g/lib
-nomake examples -qt-freetype -no-compile-examples -no-openvg -iconv -no-directwrite
-no-iwmmxt -no-crt -skip qtwebkit
;编译
mingw32-make
;安装到-prefix的变量路径中
mingw32-make install

谢谢支持