VS2015静态编译Qt5.5.1(包括Qtwebkit)

2023-07-06 13:51:46 浏览数 (1)

VS2015静态编译Qt5.5.1(包括Qtwebkit)

kingbhy

2018.04.12 20:06* 字数 859

项目中需要用到webkit,调研了webkit源码,但是源码比较庞大,用xcode编译很方便,但是本人不熟悉mac下编程,所以研究了一段时间之后只能作罢。后来了解到Qtwebkit做了不少精简的工作,而且qt对跨平台比较友好,所以转而研究Qtwebkit。研究第一步是要编译Qt和Qtwebkit,本文记录了VS2015静态编译Qt5.5.1的过程,参考了网上相关文章,做了一些补充和修改。


安装需要的工具

以下使用的库和工具的版本都是编译机器是用的版本,其他版本没有尝试。

  • python 使用2.7.14版本
  • ruby 使用25-x64版本,ruby官网文档要求安装
  • perl 使用5.24,编译webkit和OpenSSL需要
  • win_flex windows编译webkit需要
  • vs2015,安装的时候需要勾选VC工具

源码编译目录

代码语言:javascript复制
qt
    icu-58.2-vs2015
    openssl-1.0.2o
    win_flex_bison
    qt-everywhere-opensource-src-5.5.1

编译ICU和OpenSSL

  • ICU 如果直接静态编译需要修改官网的脚本,比较麻烦,好消息是有人已经静态编译过了,通过这里可以直接下载编译好的版本,这里使用的是v58.2,注意v59.1与webkit有冲突(主要是UCHAR的问题)
  • OpenSSL 网上已经有很多windows下编译OpenSSL的文章了,这里参考的是这篇文章,

修改Qt静态编译参数

打开qt-everywhere-opensource-src-5.5.1qtbasemkspecscommonmsvc-desktop.conf,修改以下编译参数。

代码语言:javascript复制
QMAKE_CFLAGS_RELEASE = -O2 -MD
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO  = -O2 -MD -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MDd

改为

代码语言:javascript复制
QMAKE_CFLAGS_RELEASE = -O2 -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO  = -O2 -MT -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MTd

修改zlib编译报错

修改qt-everywhere-opensource-src-5.5.1qt3dsrc3rdpartyassimpassimp.pri,将

代码语言:javascript复制
contains(QT_CONFIG, system-zlib) {
    unix|mingw: LIBS  = -lz
    else: LIBS  = zdll.lib
} else {
    INCLUDEPATH  = $$[QT_INSTALL_HEADERS/get]/QtZlib
}

修改为

代码语言:javascript复制
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

代码语言:javascript复制
REM Set up Microsoft Visual Studio 2015
CALL "C:Program Files (x86)Microsoft Visual Studio 14.0VCvcvarsall.bat" x86

ECHO ON

SET _CD=�%
SET _PATH=%PATH%

SET PATH=%PATH%;G:qtninja-1.8.2
SET PATH=%PATH%;C:Strawberrycbin;C:Strawberryperlsitebin;C:Strawberryperlbin
SET PATH=%PATH%;C:python3.6Scripts;C:python3.6
SET PATH=%PATH%;C:Ruby25-x64bin

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.1qt-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%

运行脚本可能出现的问题:

  • 可能会出现【rc.exe comamnd not found】,这个需要将C:Program Files (x86)Windows Kits8.1binx86(可能你的机器不是这个路径)加到PATH下
  • 在make install的时候出现了拷贝异常,出现在拷贝qttranslationstranslations的时候,修改下qttranslationstranslationsMakefile.Debug和qttranslationstranslationsMakefile.Release相关的路径即可
  • 编译ASSIMP过程中报【找不到zlib.h】,这个参考前面的zlib编译报错进行修改

编译Qtwebkit

代码语言:javascript复制
REM Set up Microsoft Visual Studio 2015
CALL "C:Program Files (x86)Microsoft Visual Studio 14.0VCvcvarsall.bat" x86

ECHO ON

SET _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.1vs2015-32
SET QTWEBKIT_PREFIX=%_CD%Qt5.5.1Qtwebkit

set PATH=%PATH%;%QT_PREFIX%bin;%QT_SOURCE%gnuwin32bin;%_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%pluginsaudio;%QT_PREFIX%pluginsbearer;^
    %QT_PREFIX%pluginsdesigner;%QT_PREFIX%pluginsgeoservices;%QT_PREFIX%pluginsiconengines;^
    %QT_PREFIX%pluginsimageformats;%QT_PREFIX%pluginsmediaservice;%QT_PREFIX%pluginsplatforms;^
    %QT_PREFIX%pluginsplaylistformats;%QT_PREFIX%pluginsposition;%QT_PREFIX%pluginsprintsupport;^
    %QT_PREFIX%pluginsqml1tooling;%QT_PREFIX%pluginsqmltooling;%QT_PREFIX%pluginssensorgestures;^
    %QT_PREFIX%pluginssensors;%ICU_PCM_DIR%lib;

perl %QT_SOURCE%qtwebkitToolsScriptsbuild-webkit --qt --%BUILD_MODE% --prefix=%QTWEBKIT_PREFIX%
CD /D %QT_SOURCE%qtwebkitWebKitBuild%BUILD_MODE%
nmake install

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

运行脚本可能出现的问题:

  • 无法解析的外部符号【 initializeTestFonts】,错误如下:
代码语言:javascript复制
 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:....binQtTestBrowser.exe @C:UsersRingAppDataLocalTempnm3ED0.tmp
  正在创建库 ....binQtTestBrowser.lib 和对象 ....binQtTestBrowser.exp
qttestbrowser.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) void __cdecl WebKit::QtTestSupport::initializeTestFonts(void)" (__imp_?initializeTestFonts@QtTestSupport@WebKit@@YAXXZ),该符号在函数 "private: void __thiscall LauncherApplication::handleUserOptions(void)" (?handleUserOptions@LauncherApplication@@AAEXXZ) 中被引用
....binQtTestBrowser.exe : fatal error LNK1120: 1 个无法解析的外部命令

需要修改qt-everywhere-opensource-src-5.4.2qtwebkitSourceWebCoreplatformqtQtTestSupport.h文件,将

代码语言:javascript复制
#if defined(BUILDING_WEBKIT)
#define TESTSUPPORT_EXPORT Q_DECL_EXPORT
#else
#define TESTSUPPORT_EXPORT Q_DECL_IMPORT
#endif

修改为

代码语言:javascript复制
#if defined(BUILDING_WEBKIT)
#define TESTSUPPORT_EXPORT /*Q_DECL_EXPORT*/
#else
#define TESTSUPPORT_EXPORT /*Q_DECL_IMPORT*/
#endif
  • 第一次编译Qtwebkit的时候碰到了无法解析的外部符号【 registerExtendedCodecs】,这个将ICU的版本换成v58.2之后再编译就没有出现了,如果出现了请参考这里

使用VS2015建立Qtwebkit项目

遇到的问题:

  • 运行项目之后出现【nextafter】错误,具体原因没有找,通过断点可以找到qt-everywhere-opensource-src-5.5.1qtwebkitSourceWTFwtfMathExtras.h,将
代码语言:javascript复制
inline double nextafter(double x, double y) { return _nextafter(x, y); }

修改为

代码语言:javascript复制
inline double nextafter(double x, double y) { return x > y ? x - DBL_EPSILON : x   DBL_EPSILON; }

然后重新编译webkit即可


0 人点赞