Pull to refresh

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

Reading time3 min
Views33K
Всех с наступающим!

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

  • Собственно, сама необходимость использовать только VS2010 и зависимость Visual C++ 2010 Runtime (msvcr100.dll, msvcp100.dll)
  • зависимость Qt5Core.dll (и соответственно вашего приложения) от ICU. Это следующие DLL-ки: icuin49.dll, icudt49.dll, icuuc49.dll
  • зависимость Qt5Gui.dll от Angle Library. Это следующие DLL-ки — libEGL.dll, libGLESv2.dll

В конце также будет рассмотрен вопрос последующего распространения приложений без необходимости устанавливать Microsoft Visual C++ 2008 Redistributable Package при установке вашей программы.

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


  • установленная Visual Studio 2008 + Service Pack 1
  • установленный Platform SDK 7.1 (я ставил 64-битный). Для того, чтобы студийный компилятор был настроен на новый SDK необходимо после установки запустить следующую команду:
    C:\Program Files\Microsoft SDKs\Windows\v7.1\Setup\WindowsSdkVer.exe -version:v7.1
    
  • установленный ActiveState Perl. Убедитесь, что perl есть в %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. Поскольку 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.3.0.tar.gz в папку. В данном примере это C:\qt
  • В Qt 5 есть нюанс, препятствующий самостоятельной компиляции. Для его решения закомментируйте строчку
    if not exist %QTSRC%\.gitignore goto sconf
    

    в файле qtbase\configure.bat
  • Заходим в C:\qt и создаём файл qt5vars.cmd следующего содержания:

    CALL "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86
    set PATH=c:\qt\qtbase\bin;c:\qt\qtrepotools\bin;c:\qt\gnuwin32\bin;%PATH%
    set QMAKESPEC=win32-msvc2008
    cd qtbase
    

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

    Сборка qtbase
    configure -opengl desktop -no-plugin-manifests -mp -nomake tests -D "_BIND_TO_CURRENT_VCLIBS_VERSION=1"
    nmake
    

    Замечание 1 Я использую -D "_BIND_TO_CURRENT_VCLIBS_VERSION=1" всегда, чтобы избежать проблем с разной версий run-time библиотек, установленных на компе (студия может использовать при линковке отличную от той, что использовалась при компиляции Qt). Такой же дефайн используется и в самих проектах.
    Замечание 2 -no-plugin-manifests используется для того, чтобы манифест студии не добавлялся в DLL файлы плагинов (для корректного распространения приложения без установок Visual C++ Redistributable). Эта опция должна быть по умолчанию, но это старый баг.

    Сборка qttools
    cd ..\qttools
    qmake
    nmake
    nmake docs
    cd ..\qtbase
    nmake docs
    


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


Простой и удобный способ не требовать установки 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. Однако, кроме этого нужно еще таскать с собой один обязательный плагин — qtbase\plugins\platforms\qwindows.dll, это следствие уровня абстракции от операционки в Qt5. Подгружается он неявно, поэтому я не сразу вычислил, почему приложение не запускается на чистой машине. Таким образом я составил следующий список того, что должно быть в инсталляке:

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

Имея этот набор файлов, вы обеспечиваете себе 100% запускаемость Вашего приложения везде и всегда.

P.S. Для кого нужно дополнительные форматы графических файлов или SQL драйверы как обычно надо еще кидать соответствующие DLL-ки в папки imageformats или sqldrivers.
Tags:
Hubs:
+23
Comments43

Articles

Change theme settings