靜態編譯 Qt 5.6(有腳本)


源碼下載

  • Qt git地址:git://code.qt.io/qt/qt5.git
  • 推薦用 SourceTree 客戶端來克隆源碼

准備工作

  • 系統 Windows 7 或者 Windows 10
  • 編譯器 Visual Studio 2013 Update 5 或者 Visual Studio 2015 Update 1
  • 安裝ActivePerl
  • 安裝Python
  • 靜態編譯ICU庫
    • ICU庫需要把DebugRelease版本都編出來
  • 靜態編譯openssl
  • 編譯webkit需要的環境
  • 最重要的准備工作
    • 關閉360等安全衛士,殺毒軟件,編譯過程中360會彈框攔截
  • 使用 vs2013 編譯的時候,有可能會遇到以下錯誤

    1
    Error 2 error C2440: 'default argument' : cannot convert from 'const wchar_t [1]' to 'const BSTR' (src\GAudioOutput.cc) C:\Program Files (x86)\Windows Kits\8.1\Include\um\sapi.h 16917 1 qgroundcontrol

    遇到這個問題,需要修改 qtbase\mkspecs\common\msvc-base.conf 文件,將下面這段刪除,如圖

  • 編譯前,最好將 git python perl ruby等相關的路徑從系統的PATH環境變量中刪除

編譯錯誤

  • 編譯過程中會遇到以下錯誤

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    libeay32.lib(rand_win.obj) : error LNK2019: 無法解析的外部符號 __imp__BitBlt@36,該符號在函數 _readscreen 中被引用
    libeay32.lib(rand_win.obj) : error LNK2019: 無法解析的外部符號 __imp__CreateCompatibleBitmap@12,該符號在函數 _readscreen 中被引用
    libeay32.lib(rand_win.obj) : error LNK2019: 無法解析的外部符號 __imp__CreateCompatibleDC@4,該符號在函數 _readscreen 中被引用
    libeay32.lib(rand_win.obj) : error LNK2019: 無法解析的外部符號 __imp__CreateDCA@16,該符號在函數 _readscreen 中被引用
    libeay32.lib(rand_win.obj) : error LNK2019: 無法解析的外部符號 __imp__DeleteDC@4,該符號在函數 _readscreen 中被引用
    libeay32.lib(rand_win.obj) : error LNK2019: 無法解析的外部符號 __imp__DeleteObject@4,該符號在函數 _readscreen 中被引用
    libeay32.lib(rand_win.obj) : error LNK2019: 無法解析的外部符號 __imp__GetBitmapBits@12,該符號在函數 _readscreen 中被引用
    libeay32.lib(rand_win.obj) : error LNK2019: 無法解析的外部符號 __imp__GetDeviceCaps@8,該符號在函數 _readscreen 中被引用
    libeay32.lib(rand_win.obj) : error LNK2019: 無法解析的外部符號 __imp__SelectObject@8,該符號在函數 _readscreen 中被引用
    libeay32.lib(rand_win.obj) : error LNK2019: 無法解析的外部符號 __imp__GetObjectA@12,該符號在函數 _readscreen 中被引用

    這個需要在配置參數中增加一個鏈接庫

    1
    -L "C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Lib" -l Gdi32

編譯

  • 新建一個 environment.bat,用來執行環境變量的設置,代碼如下:

    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
    @echo off

    rem 設置vs安裝路徑
    set MSVC_PATH=D:\Programs\Microsoft Visual Studio 12.0

    rem 設置icu源碼路徑,在編譯icu時用到,編譯qt用不到源碼
    set ICU_SRC_PATH=D:\Qt\static_build\icu-source\source

    rem 設置icu編譯release安裝的路徑,在編譯icu時用到,編譯qt用不到這個格式的路徑,注意安裝路徑格式,是linux風格
    set ICU_INSTALL_PATH=/cygdrive/D/Qt/static_build/icu

    rem 設置icu編譯debug安裝的路徑,在編譯icu時用到,編譯qt用不到這個格式的路徑,注意安裝路徑格式,是linux風格
    set ICU_INSTALL_PATH_DEBUG=/cygdrive/D/Qt/static_build/icu-debug

    rem 設置CYG依賴,在編譯icu時用到,編譯qt用不到
    set CYG_WIN_PATH=D:\Programs\Dev\cygwin64\bin

    rem 設置ICU編譯release安裝的路徑,編譯Qt會用到,注意格式,是Windows風格
    set ICU_INSTALL_PATH_WIN=D:\Qt\static_build\icu

    rem 設置ICU編譯debug安裝的路徑,編譯Qt會用到,注意格式,是Windows風格
    set ICU_INSTALL_PATH_WIN_DEBUG=D:\Qt\static_build\icu-debug

    rem 設置openssl源碼路徑,在編譯openssl時用到,編譯qt用不到源碼
    set OPENSSL_SRC_PATH=D:\Qt\static_build\openssl-1.0.1p

    rem 設置openssl的最終安裝路徑,編譯qt時會用到
    set OPENSSL_INSTALL_PATH=D:\Qt\static_build\openssl

    rem 設置編譯Qt的編譯器配置文件名
    set QMAKESPEC=win32-msvc2013

    rem 設置qt的源碼路徑
    set QT5_SRC_PATH=D:\Qt\static_build\qt5

    rem 設置qt編譯后的安裝路徑
    set QT5_INSTALL_PATH=D:\Qt\qt_5.6.0_release_2013_static

    rem 設置git安裝路徑
    set GIT_PATH=C:\Program Files\Git

    rem 設置Perl的bin路徑
    set PERL_PATH=D:\Programs\Dev\Perl\bin

    rem 設置python安裝路徑
    set PYTHON_PATH=D:\Programs\Dev\Python27

    rem qtwebkit依賴環境
    set WIN_FLEX_BISION_PATH=D:\Programs\Dev\win_flex_bison-latest
    set SQLITE3SRCDIR=D:\Qt\3rd\sqlite-amalgamation-3090100
    set RUBY_PATH=D:\Programs\Dev\Ruby22\bin

    rem 執行MSVC環境設置
    call "%MSVC_PATH%\VC\vcvarsall.bat" x86
  • 新建一個 build_qt.bat,用來執行qt的編譯,代碼如下

    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
    @echo off

    call environment.bat

    set PATH=%QT5_SRC_PATH%\qtbase\bin;%QT5_SRC_PATH%\qtbase\lib;%QT5_SRC_PATH%\gnuwin32\bin;%GIT_PATH%\bin;%PATH%
    set PATH=%QT5_SRC_PATH%\qtrepotools\bin;%PATH%
    set PATH=%PATH%;%PERL_PATH%;%PYTHON_PATH%

    set LIB=%LIB%;%ICU_INSTALL_PATH_WIN%\lib;%ICU_INSTALL_PATH_WIN_DEBUG%\lib;%OPENSSL_INSTALL_PATH%\lib
    set INCLUDE=%INCLUDE%;%ICU_INSTALL_PATH_WIN%\include;%OPENSSL_INSTALL_PATH%\include
    set PATH=%PATH%;%ICU_INSTALL_PATH_WIN%\bin;%OPENSSL_INSTALL_PATH%\bin;%ICU_INSTALL_PATH_WIN%\lib;%ICU_INSTALL_PATH_WIN_DEBUG%\lib

    cd /D %QT5_SRC_PATH%

    call %QT5_SRC_PATH%\configure -prefix %QT5_INSTALL_PATH% -debug-and-release -force-debug-info -opensource -confirm-license -static -static-runtime -opengl dynamic -mp -icu -openssl-linked -nomake examples -nomake tests -no-compile-examples -target xp -no-directwrite -L "C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Lib" -l Gdi32

    nmake

    nmake install

    rem 復制openssl和icu到qt安裝目錄中
    xcopy /y /k "%ICU_INSTALL_PATH_WIN%\lib\sicudt.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%ICU_INSTALL_PATH_WIN%\lib\sicuin.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%ICU_INSTALL_PATH_WIN%\lib\sicuuc.lib" "%QT5_INSTALL_PATH%\lib\"

    xcopy /y /k "%ICU_INSTALL_PATH_WIN_DEBUG%\lib\sicudtd.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%ICU_INSTALL_PATH_WIN_DEBUG%\lib\sicuind.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%ICU_INSTALL_PATH_WIN_DEBUG%\lib\sicuucd.lib" "%QT5_INSTALL_PATH%\lib\"

    xcopy /y /k "%OPENSSL_INSTALL_PATH%\lib\libeay32.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%OPENSSL_INSTALL_PATH%\lib\ssleay32.lib" "%QT5_INSTALL_PATH%\lib\"

    pause
  • 雙擊執行 build_qt.bat,整個編譯過程可能需要4、5個小時

  • 新建一個 build_qtwebkit.bat,用來執行qtwebkit的編譯,代碼如下

    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
    @echo off

    call environment.bat

    set LIB=%LIB%;%ICU_INSTALL_PATH_WIN%\lib;%ICU_INSTALL_PATH_WIN_DEBUG%\lib;%OPENSSL_INSTALL_PATH%\lib;%QT5_INSTALL_PATH%\lib
    set INCLUDE=%INCLUDE%;%ICU_INSTALL_PATH_WIN%\include;%OPENSSL_INSTALL_PATH%\include;%QT5_INSTALL_PATH%\include
    set PATH=%QT5_INSTALL_PATH%\bin;%WIN_FLEX_BISION_PATH%;%ICU_INSTALL_PATH_WIN%\bin;%OPENSSL_INSTALL_PATH%\bin;%ICU_INSTALL_PATH_WIN%\lib;%ICU_INSTALL_PATH_WIN_DEBUG%\lib;%QT5_SRC_PATH%\gnuwin32\bin;%PERL_PATH%;%PYTHON_PATH%;%RUBY_PATH%;%PATH%

    cd /D %QT5_SRC_PATH%

    %PERL_PATH%\perl %QT5_SRC_PATH%\qtwebkit\Tools\Scripts\build-webkit --qt > build_qtwebkit.log

    rem 復制qtwebkit靜態庫到qt安裝目錄中
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\bin\QtTestBrowser.exe" "%QT5_INSTALL_PATH%\bin\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\bin\QtTestBrowser.pdb" "%QT5_INSTALL_PATH%\bin\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\bin\jsc.exe" "%QT5_INSTALL_PATH%\bin\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\bin\jsc.pdb" "%QT5_INSTALL_PATH%\bin\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\bin\ImageDiff.exe" "%QT5_INSTALL_PATH%\bin\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\bin\ImageDiff.pdb" "%QT5_INSTALL_PATH%\bin\"

    xcopy /s /e /h /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\imports\*.*" "%QT5_INSTALL_PATH%\imports\"

    xcopy /s /e /h /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\include\*.*" "%QT5_INSTALL_PATH%\include\"

    xcopy /s /e /h /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\lib\*.*" "%QT5_INSTALL_PATH%\lib\"

    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\JavaScriptCore\release\JavaScriptCore.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\JavaScriptCore\release\JavaScriptCore.pdb" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\JavaScriptCore\debug\JavaScriptCored.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\JavaScriptCore\debug\JavaScriptCored.pdb" "%QT5_INSTALL_PATH%\lib\"

    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\ThirdParty\ANGLE\release\ANGLE.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\ThirdParty\ANGLE\release\ANGLE.pdb" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\ThirdParty\ANGLE\debug\ANGLEd.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\ThirdParty\ANGLE\debug\ANGLEd.pdb" "%QT5_INSTALL_PATH%\lib\"

    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\ThirdParty\leveldb\release\leveldb.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\ThirdParty\leveldb\release\leveldb.pdb" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\ThirdParty\leveldb\debug\leveldbd.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\ThirdParty\leveldb\debug\leveldbd.pdb" "%QT5_INSTALL_PATH%\lib\"

    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WebCore\release\WebCore.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WebCore\release\WebCore.pdb" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WebCore\debug\WebCored.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WebCore\debug\WebCored.pdb" "%QT5_INSTALL_PATH%\lib\"

    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WebKit\release\WebKit1.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WebKit\release\WebKit1.pdb" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WebKit\debug\WebKit1d.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WebKit\debug\WebKit1d.pdb" "%QT5_INSTALL_PATH%\lib\"

    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WebKit2\release\WebKit2.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WebKit2\release\WebKit2.pdb" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WebKit2\debug\WebKit2d.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WebKit2\debug\WebKit2d.pdb" "%QT5_INSTALL_PATH%\lib\"

    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WTF\release\WTF.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WTF\release\WTF.pdb" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WTF\debug\WTFd.lib" "%QT5_INSTALL_PATH%\lib\"
    xcopy /y /k "%QT5_SRC_PATH%\qtwebkit\WebKitBuild\Release\Source\WTF\debug\WTFd.pdb" "%QT5_INSTALL_PATH%\lib\"

    pause
  • 如果要重新編譯,需要清除之前編譯的臨時文件,可以新建一個 clean_qt.bat 來執行清理工作,代碼如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @echo off

    call environment.bat

    set PATH=%QT5_SRC_PATH%\qtbase\bin;%QT5_SRC_PATH%\qtbase\lib;%QT5_SRC_PATH%\gnuwin32\bin;%GIT_PATH%\bin;%PATH%
    set PATH=%QT5_SRC_PATH%\qtrepotools\bin;%PATH%
    set PATH=%PATH%;%PERL_PATH%;%PYTHON_PATH%

    cd /D %QT5_SRC_PATH%

    git submodule foreach --recursive "git clean -dfx"

    pause

參考文章

編譯 Qt 5.6

 

http://wangjie.rocks/2016/04/12/static-compile-qt/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM