美文网首页我爱编程
VS2015静态编译Qt5.5.1(包括Qtwebkit)

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

作者: kingbhy | 来源:发表于2018-04-12 20:06 被阅读0次

    项目中需要用到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工具
    源码编译目录
    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.1\qtbase\mkspecs\common\msvc-desktop.conf,修改以下编译参数。

    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编译报错

    修改\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%
    

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

    • 可能会出现【rc.exe comamnd not found】,这个需要将C:\Program Files (x86)\Windows Kits\8.1\bin\x86(可能你的机器不是这个路径)加到PATH下
    • 在make install的时候出现了拷贝异常,出现在拷贝\qttranslations\translations的时候,修改下\qttranslations\translations\Makefile.Debug和\qttranslations\translations\Makefile.Release相关的路径即可
    • 编译ASSIMP过程中报【找不到zlib.h】,这个参考前面的zlib编译报错进行修改
    编译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%
    

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

    • 无法解析的外部符号【 initializeTestFonts】,错误如下:
     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
      正在创建库 ..\..\bin\QtTestBrowser.lib 和对象 ..\..\bin\QtTestBrowser.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) 中被引用
    ..\..\bin\QtTestBrowser.exe : fatal error LNK1120: 1 个无法解析的外部命令
    

    需要修改\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的时候碰到了无法解析的外部符号【 registerExtendedCodecs】,这个将ICU的版本换成v58.2之后再编译就没有出现了,如果出现了请参考这里
    使用VS2015建立Qtwebkit项目

    遇到的问题:

    • 运行项目之后出现【nextafter】错误,具体原因没有找,通过断点可以找到\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即可


    参考列表:

    相关文章

      网友评论

        本文标题:VS2015静态编译Qt5.5.1(包括Qtwebkit)

        本文链接:https://www.haomeiwen.com/subject/hlsfkftx.html