VS2015靜態(tài)編譯Qt5.5.1(包括Qtwebkit)

項(xiàng)目中需要用到webkit,調(diào)研了webkit源碼,但是源碼比較龐大壶栋,用xcode編譯很方便,但是本人不熟悉mac下編程普监,所以研究了一段時(shí)間之后只能作罷贵试。后來(lái)了解到Qtwebkit做了不少精簡(jiǎn)的工作,而且qt對(duì)跨平臺(tái)比較友好凯正,所以轉(zhuǎn)而研究Qtwebkit毙玻。研究第一步是要編譯Qt和Qtwebkit,本文記錄了VS2015靜態(tài)編譯Qt5.5.1的過(guò)程廊散,參考了網(wǎng)上相關(guān)文章桑滩,做了一些補(bǔ)充和修改。


安裝需要的工具

以下使用的庫(kù)和工具的版本都是編譯機(jī)器是用的版本允睹,其他版本沒(méi)有嘗試运准。

  • python 使用2.7.14版本
  • ruby 使用25-x64版本,ruby官網(wǎng)文檔要求安裝
  • perl 使用5.24缭受,編譯webkit和OpenSSL需要
  • win_flex windows編譯webkit需要
  • vs2015胁澳,安裝的時(shí)候需要勾選VC工具
源碼編譯目錄
qt
    icu-58.2-vs2015
    openssl-1.0.2o
    win_flex_bison
    qt-everywhere-opensource-src-5.5.1
編譯ICU和OpenSSL
  • ICU 如果直接靜態(tài)編譯需要修改官網(wǎng)的腳本,比較麻煩米者,好消息是有人已經(jīng)靜態(tài)編譯過(guò)了韭畸,通過(guò)這里可以直接下載編譯好的版本,這里使用的是v58.2塘雳,注意v59.1與webkit有沖突(主要是UCHAR的問(wèn)題
  • OpenSSL 網(wǎng)上已經(jīng)有很多windows下編譯OpenSSL的文章了陆盘,這里參考的是這篇文章
修改Qt靜態(tài)編譯參數(shù)

打開(kāi)\qt-everywhere-opensource-src-5.5.1\qtbase\mkspecs\common\msvc-desktop.conf败明,修改以下編譯參數(shù)隘马。

QMAKE_CFLAGS_RELEASE = -O2 -MD
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MDd

改為

QMAKE_CFLAGS_RELEASE = -O2 -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MTd
修改zlib編譯報(bào)錯(cuò)

修改\qt-everywhere-opensource-src-5.5.1\qt3d\src\3rdparty\assimp\assimp.pri,將

contains(QT_CONFIG, system-zlib) {
    unix|mingw: LIBS += -lz
    else: LIBS += zdll.lib
} else {
    INCLUDEPATH += $$[QT_INSTALL_HEADERS/get]/QtZlib
}

修改為

contains(QT_CONFIG, system-zlib) {
    if (unix|mingw):         LIBS += -lz
    else:                    LIBS += zdll.lib
    } else {
    git_build: \
        INCLUDEPATH += $$[QT_INSTALL_HEADERS/get]/QtZlib
    else: \
        INCLUDEPATH += $$[QT_INSTALL_HEADERS/src]/QtZlib
}
編譯Qt


REM Set up Microsoft Visual Studio 2015
CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86

ECHO ON

SET _CD=%CD%
SET _PATH=%PATH%

SET PATH=%PATH%;G:\qt\ninja-1.8.2\
SET PATH=%PATH%;C:\Strawberry\c\bin;C:\Strawberry\perl\site\bin;C:\Strawberry\perl\bin
SET PATH=%PATH%;C:\python3.6\Scripts\;C:\python3.6\
SET PATH=%PATH%;C:\Ruby25-x64\bin

SET ICU_PCM_DIR=%_CD%\icu-58.2-vs2015
SET OPENSSL_DIR=%_CD%\openssl-1.0.2o
SET QT_SOURCE=%_CD%\qt-everywhere-opensource-src-5.8.0
SET QT_PREFIX=%_CD%\Qt5.5.1\qt-static

REM Setting ICU
SET PATH=%PATH%;%ICU_PCM_DIR%\bin

REM Building Qt
CALL %QT_SOURCE%\configure -confirm-license -opensource -platform win32-msvc2015 ^
    -debug-and-release -static -force-debug-info^
    -prefix %QT_PREFIX% ^
    -qt-sqlite -qt-pcre -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -qt-freetype ^
    -nomake tests -nomake examples ^
    -icu -I %ICU_PCM_DIR%\include -L %ICU_PCM_DIR%\lib^
    -openssl-linked -I %OPENSSL_DIR%\include -L %OPENSSL_DIR%\lib ^
    ICU_LIBS_DEBUG="-lsicudtd -lsicuind -lsicuucd -lAdvapi32" ^
    ICU_LIBS_RELEASE="-lsicudt -lsicuin -lsicuuc -lAdvapi32" ^
    OPENSSL_LIBS="-lUser32 -lAdvapi32 -lGdi32 -lCrypt32" ^
    OPENSSL_LIBS_DEBUG="-llibeay32MTD -lssleay32MTD" ^
    OPENSSL_LIBS_RELEASE="-llibeay32MT -lssleay32MT"


nmake && nmake install

CD /D %_CD%
SET PATH=%_PATH%

運(yùn)行腳本可能出現(xiàn)的問(wèn)題:

  • 可能會(huì)出現(xiàn)【rc.exe comamnd not found】妻顶,這個(gè)需要將C:\Program Files (x86)\Windows Kits\8.1\bin\x86(可能你的機(jī)器不是這個(gè)路徑)加到PATH下
  • 在make install的時(shí)候出現(xiàn)了拷貝異常酸员,出現(xiàn)在拷貝\qttranslations\translations的時(shí)候,修改下\qttranslations\translations\Makefile.Debug和\qttranslations\translations\Makefile.Release相關(guān)的路徑即可
  • 編譯ASSIMP過(guò)程中報(bào)【找不到zlib.h】讳嘱,這個(gè)參考前面的zlib編譯報(bào)錯(cuò)進(jìn)行修改
編譯Qtwebkit


REM Set up \Microsoft Visual Studio 2015
CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86

ECHO ON

SET _CD=%CD%
SET _PATH=%PATH%

SET BUILD_MODE=debug
SET ICU_PCM_DIR=%_CD%\icu-58.2-vs2015
SET QT_SOURCE=%_CD%\qt-everywhere-opensource-src-5.5.1
SET QT_PREFIX=%_CD%\Qt5.5.1\vs2015-32
SET QTWEBKIT_PREFIX=%_CD%\Qt5.5.1\Qtwebkit

set PATH=%PATH%;%QT_PREFIX%\bin;%QT_SOURCE%\gnuwin32\bin;%_CD%\win_flex_bison
set INCLUDE=%INCLUDE%;%QT_PREFIX%\include;%ICU_PCM_DIR%\include;
set LIB=%LIB%;%QT_PREFIX%\lib;%QT_PREFIX%\plugins;%QT_PREFIX%\plugins\audio;%QT_PREFIX%\plugins\bearer;^
    %QT_PREFIX%\plugins\designer;%QT_PREFIX%\plugins\geoservices;%QT_PREFIX%\plugins\iconengines;^
    %QT_PREFIX%\plugins\imageformats;%QT_PREFIX%\plugins\mediaservice;%QT_PREFIX%\plugins\platforms;^
    %QT_PREFIX%\plugins\playlistformats;%QT_PREFIX%\plugins\position;%QT_PREFIX%\plugins\printsupport;^
    %QT_PREFIX%\plugins\qml1tooling;%QT_PREFIX%\plugins\qmltooling;%QT_PREFIX%\plugins\sensorgestures;^
    %QT_PREFIX%\plugins\sensors;%ICU_PCM_DIR%\lib;

perl %QT_SOURCE%\qtwebkit\Tools\Scripts\build-webkit --qt --%BUILD_MODE% --prefix=%QTWEBKIT_PREFIX%
CD /D %QT_SOURCE%\qtwebkit\WebKitBuild\%BUILD_MODE%
nmake install

CD /D %_CD%
SET PATH=%_PATH%

運(yùn)行腳本可能出現(xiàn)的問(wèn)題:

  • 無(wú)法解析的外部符號(hào)【 initializeTestFonts】幔嗦,錯(cuò)誤如下:
 link /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST:embed /OUT:..\..\bin\QtTestBrowser.exe @C:\Users\Ring\AppData\Local\Temp\nm3ED0.tmp
  正在創(chuàng)建庫(kù) ..\..\bin\QtTestBrowser.lib 和對(duì)象 ..\..\bin\QtTestBrowser.exp
qttestbrowser.obj : error LNK2019: 無(wú)法解析的外部符號(hào) "__declspec(dllimport) void __cdecl WebKit::QtTestSupport::initializeTestFonts(void)" (__imp_?initializeTestFonts@QtTestSupport@WebKit@@YAXXZ),該符號(hào)在函數(shù) "private: void __thiscall LauncherApplication::handleUserOptions(void)" (?handleUserOptions@LauncherApplication@@AAEXXZ) 中被引用
..\..\bin\QtTestBrowser.exe : fatal error LNK1120: 1 個(gè)無(wú)法解析的外部命令

需要修改\qt-everywhere-opensource-src-5.4.2\qtwebkit\Source\WebCore\platform\qt\QtTestSupport.h文件沥潭,將

#if defined(BUILDING_WEBKIT)
#define TESTSUPPORT_EXPORT Q_DECL_EXPORT
#else
#define TESTSUPPORT_EXPORT Q_DECL_IMPORT
#endif

修改為

#if defined(BUILDING_WEBKIT)
#define TESTSUPPORT_EXPORT /*Q_DECL_EXPORT*/
#else
#define TESTSUPPORT_EXPORT /*Q_DECL_IMPORT*/
#endif
  • 第一次編譯Qtwebkit的時(shí)候碰到了無(wú)法解析的外部符號(hào)【 registerExtendedCodecs】邀泉,這個(gè)將ICU的版本換成v58.2之后再編譯就沒(méi)有出現(xiàn)了,如果出現(xiàn)了請(qǐng)參考這里
使用VS2015建立Qtwebkit項(xiàng)目

遇到的問(wèn)題:

  • 運(yùn)行項(xiàng)目之后出現(xiàn)【nextafter】錯(cuò)誤,具體原因沒(méi)有找汇恤,通過(guò)斷點(diǎn)可以找到\qt-everywhere-opensource-src-5.5.1\qtwebkit\Source\WTF\wtf\MathExtras.h庞钢,將
inline double nextafter(double x, double y) { return _nextafter(x, y); }

修改為

inline double nextafter(double x, double y) { return x > y ? x - DBL_EPSILON : x + DBL_EPSILON; }

然后重新編譯webkit即可


參考列表:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市因谎,隨后出現(xiàn)的幾起案子基括,更是在濱河造成了極大的恐慌,老刑警劉巖财岔,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件风皿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡匠璧,警方通過(guò)查閱死者的電腦和手機(jī)桐款,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)患朱,“玉大人鲁僚,你說(shuō)我怎么就攤上這事〔锰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵侨艾,是天一觀的道長(zhǎng)执虹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)唠梨,這世上最難降的妖魔是什么袋励? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮当叭,結(jié)果婚禮上茬故,老公的妹妹穿的比我還像新娘。我一直安慰自己蚁鳖,他們只是感情好磺芭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著醉箕,像睡著了一般钾腺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讥裤,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天放棒,我揣著相機(jī)與錄音,去河邊找鬼己英。 笑死间螟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播厢破,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼邮府,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了溉奕?” 一聲冷哼從身側(cè)響起褂傀,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎加勤,沒(méi)想到半個(gè)月后仙辟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳄梅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年叠国,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戴尸。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粟焊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孙蒙,到底是詐尸還是另有隱情项棠,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布挎峦,位于F島的核電站香追,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坦胶。R本人自食惡果不足惜透典,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顿苇。 院中可真熱鬧峭咒,春花似錦、人聲如沸纪岁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蜂科。三九已至顽决,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間导匣,已是汗流浹背才菠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贡定,地道東北人赋访。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蚓耽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渠牲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容