- PVSM.RU - https://www.pvsm.ru -

Сборка Qt 5 в Visual Studio 2008

Всех с наступающим!

Digia предлагает Qt5 для Windows только скопилированную под Visual Studio 2010, причем с параметрами, которые не для всех идеальны. В частности это

  • Собственно, сама необходимость использовать только VS2010
  • зависимость Qt5Core.dll (и соответственно вашего приложения) от ICU [1]. Это следущие DLL-ки: icuin49.dll, icudt49.dll, icuuc49.dll
  • зависимость Qt5Gui.dll от Angle Library [2]. Это следущие DLL-ки — libEGL.dll, libGLESv2.dll
  • зависимость от Visual C++ 2010 Runtime (msvcr100.dll, msvcp100.dll). Для большинства это пожалуй не минус, т.к. в случае 2008 студии идут другие DLL-ки (msvcp90.dll и msvcr90.dll). Однако, во-первых последние стоят на многих машинах, а во-вторых в конце статьи будет приведет удобный способ таскать их с собой без необходимости устанавливать Microsoft Visual C++ 2008 Redistributable Package при установке вашего приложения.

В конце также будет рассмотрен вопрос последущего распространения приложений.

Что необходимо

  • установленная Visual Studio 2008 + Service Pack 1 [3]
  • установленный Platform SDK 7.1 [4] (я ставил 64битный). Для того, чтобы студийный компилятор был настроен на новый SDK необходимо после установки запустить следущую команду:
    C:Program FilesMicrosoft SDKsWindowsv7.1SetupWindowsSdkVer.exe -version:v7.1
    
  • установленный ActiveState Perl [5]. Убедитесь, что perl есть в %PATH%
  • установленный Python 2.7 [6]. Убедитесь, python есть в %PATH%

Замечание: поскольку мне не нужна компиляция qtactiveqt, qtdeclarative, qtwebkit и прочих, а необходима только qtbase (Qt5Core/Qt5Gui/Qt5Network/Qt5Widgets/Qt5Sql/etc) и qttools (assistant, designer, etc), configure я буду запускать только в qtbase, тогда как при полной компиляции библиотеки configure следует запускать в корне.
Замечание 2: по умолчанию qt5 пытается использовать OpenGL 2/Angle, для компиляции которого необходим DirectX SDK [7]. Поскольку QML2 и OpenGL2 мне не нужен, я использую опцию configure -opengl desktop, которая скажет QtGui использовать старый opengl32.dll (стандарт OpenGL 1.1, есть в любой Windows XP и выше). Для эсперимента также проводил компиляцию с установленным DirectX SDK, в этом случае в зависимостях Qt5Gui.dll будут 2 дополнительные DLL-ки — libEGL.dll и libGLESv2.dll.

Компиляция

  • Распаковываем архив qt-everywhere-opensource-src-5.0.0.tar.gz [8] в папку. В данном примере это C:qt
  • В Qt 5.0.0 есть баг [9], препятствующий самостоятельной компиляции. Для его решения закоментируйте строчку
    if not exist %QTSRC%.gitignore goto sconf
    

    в файле qtbaseconfigure.bat

  • Заходим в C:qt и создаём файл qt5vars.cmd следущего содержания:
    CALL "C:Program Files (x86)Microsoft Visual Studio 9.0VCvcvarsall.bat" x86
    set PATH=c:qtqtbasebin;c:qtqtrepotoolsbin;c:qtgnuwin32bin;%PATH%
    set QMAKESPEC=win32-msvc2008
    

    Теперь там же создаём новый ярлык (cmd.lnk) со следущими свойствами:
    Оъект: %SystemRoot%system32cmd.exe %SystemRoot%system32cmd.exe /E:ON /V:ON /k c:qtqt5vars.cmd
    Рабочая папка: c:qt

  • Запускаем cmd.lnk и выполняем последовательно следущие команды, между которыми можно попить кофе:
    cd qtbase
    configure -opengl desktop -D "_BIND_TO_CURRENT_VCLIBS_VERSION=1"
    nmake
    cd qttools
    qmake
    nmake
    

    Я использую -D "_BIND_TO_CURRENT_VCLIBS_VERSION=1" всегда, чтобы избежать проблем с разной версий run-time библиотек, установленных на компе (тудия может использовать при линковке отличную от той, что использовалась при компиляции Qt). Такой же дефайн используется и в самих проектах.

Распространение приложений

Простой и удобный способ не требовать установки Visual C++ 2008 Redistrubutable package, это таскать с собой 3 файла:
msvcp90.dll, msvcr90.dll и Microsoft.VC90.CRT.manifest

Здесь рассматривается достаточно простой пример приложения, которое портировалось с Qt4 на Qt5. Раньше в его зависимостях были 3 модуля Qt — QtCore4.dll, QtGui4.dll, QtNetwork4.dll. Теперь Qt-шных библиотек 4 — Qt5Core.dll, Qt5Gui.dll, Qt5Network.dll, Qt5Widgets.dll. Однако, кроме этого нужно еще таскать с собой один обязательный плагин — qtbasepluginsplatformsqwindows.dll, это следствие уровеня абстракции от операционки в Qt5. Подгружается он неявно, поэтому я не сразу вычислил, почему приложение не запускается на чистой машине. Таким образом я составил следущий список того, что должно быть в инсталляке:

— myapp.exe
— Qt5Core.dll, Qt5Gui.dll, Qt5Network.dll, Qt5Widgets.dll
— msvcp90.dll, msvcr90.dll, Microsoft.VC90.CRT.manifest
— platformsqwindows.dll

Но это еще не всё! Инсталляк еще должен скопировать в папку platforms 2 файла — msvcr90.dll, Microsoft.VC90.CRT.manifest. Однако проделав всё это, вы обеспечиваете себе 100% запускаемость Вашего приложения везде и всегда.

P.S. Для кого нужно дополнительные форматы графических файлов или SQL драйверы как обычно надо еще кидать соответствующие DLL-ки в папки imageformats или sqldrivers.
P.P.S. В данную статью не входит самостоятельная компиляции документации (пока не дошли руки). Об этом можно почитать здесь [10]

Надеюсь, этот материал будет многим полезен.

Автор: andydufreyne

Источник [11]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/windows/23814

Ссылки в тексте:

[1] ICU: http://site.icu-project.org/

[2] Angle Library: http://code.google.com/p/angleproject/

[3] Service Pack 1: http://www.microsoft.com/en-us/download/details.aspx?id=10986

[4] Platform SDK 7.1: http://www.microsoft.com/en-us/download/details.aspx?id=8279

[5] ActiveState Perl: http://www.activestate.com/activeperl

[6] Python 2.7: http://www.python.org/download/releases/2.7.2/

[7] DirectX SDK: http://www.microsoft.com/en-us/download/details.aspx?id=6812

[8] qt-everywhere-opensource-src-5.0.0.tar.gz: http://releases.qt-project.org/qt5/5.0.0/single/qt-everywhere-opensource-src-5.0.0.tar.gz

[9] баг: https://bugreports.qt-project.org/browse/QTBUG-28743

[10] здесь: http://qt-project.org/wiki/Building_Qt_5_Documentation

[11] Источник: http://habrahabr.ru/post/164357/