Введение
В этой статье нет ничего сверхъестественного. Я хотел просто собрать вместе все нюансы и проблемы, с которыми я столкнулся, связанные с построением Qt в одной статье — вдруг кому-нибудь пригодиться.
Задача заключалась прежде всего в том что бы избавиться от проблем со звуком под XP, путем использования dsengine как альтернативу самописного плагина воспроизведения звука (на основе ffmpeg), а для Windows Vista+ можно вполне использовать wmfengine. Поэтому выбор пал на версию 5.1.1.
Так же я преследовал цель получить более расширенную версию языка C++11, поэтому я собирал под Visual C++ 11.0 ( x86 ). Проблем с x64 версией библиотек проблем нет ее можно скачать с официального сайта.
Так же в названии статьи присутствует “XP” — потому что именно в на этой операционной системе и возникали проблемы, так как.
Итак, приступим…
- Вначале все просто — ищем на официальном сайте на странице загрузок ( qt-project.org/downloads ) подходящий нам вариант или сразу скачиваем исходники ( download.qt-project.org/official_releases/qt/5.1/5.1.1/single/ ).
- Дальше распаковываем (главное в пути лучше не иметь ни пробелов).
- Дальше ищем все зависимости, читаем ( qt-project.org/wiki/Building_Qt_5_from_Git )
Понимаем что нам нужно:- icu
- pthreads
- Ruby
- утилиты из папки в корне архива gnuwin32
- Microsoft DirectX SDK (для компиляции qt 5 требуется DirectX SDK — он не ставиться если есть Microsoft Visual C++ 2010 x86/x64 redistributable — 10.0.(number over 30319))
В итоге получаем следующий bat-файл vars32.bat:
REM For fast compiling set CL=/MP REM include set INCLUDE=e:\share\_open_source_\icu-51.2-vs2012\include\;e:\share\_open_source_\pthreads\include\;%INCLUDE% REM lib set LIB=e:\share\_open_source_\icu-51.2-vs2012\lib\;e:\share\_open_source_\pthreads\lib\x86\;%LIB% REM tools set PATH=e:\share\_open_source_\icu-51.2-vs2012\bin\;C:\Ruby200-x64\bin;%CD%\gnuwin32\bin\;C:\Python27;C:\Perl64\bin;C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Utilities\bin\x86;%CD%\qtbase\bin\;e:\share\_open_source_\pthreads\dll\x86\;%PATH%
- Для удачной сборки под XP
- читаем статью на msdn о том как компилировать ( blogs.msdn.com/b/vcblog/archive/2012/10/08/10357555.aspx
- проверяем что у нас Visual Studio имеет хотя бы один update
- обращаем внимание на опечатку в путях (v7.1A)
- не забываем про запуск скрипта для утилиты nmake с параметром
- дописываем vars32. bat:
… REM for nmake CALL "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" x86 REM for XP set INCLUDE=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Include;%INCLUDE% set PATH=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Bin;%PATH% set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Lib;%LIB% set CL=/D_USING_V110_SDK71_;%CL%
- Так как этого может быть недостаточно изменяем файлы конфигурации Qt:
а) Файл qtbase\src\corelib\io\qfilesystemengine_win.cpp, строка 574, меняем на
# if defined(Q_CC_MINGW) || (defined(Q_CC_MSVC) && _MSC_VER < 1700) || (defined(Q_CC_MSVC) && _MSC_VER >= 1700 && defined(_USING_V110_SDK71_))
Иначе из-за объявленной дерективы _USING_V110_SDK71_ союрать не удастся
б) Файл qtbase\qmake\Makefile.win32
в переменный CFLAGS_BARE добавляем по -DUNICODE -D_USING_V110_SDK71_
в) Файл qtbase\mkspecs\win32-msvc2012\qmake.conf, в переменную QMAKE_CFLAGS:QMAKE_CFLAGS = -nologo -Zm200 -Zc:wchar_t -D_USING_V110_SDK71_
, а так же QMAKE_LFLAGS_CONSOLE и QMAKE_LFLAGS_WINDOWS:
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE,5.01 QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01
- Далее нам понадобится сконфигурировать Qt. Для этого мы создаем conf32.bat и дописываем в него следующую строку
configure -no-angle -mp -debug-and-release -no-audio-backend -opengl desktop -platform win32-msvc2012 -skip qtwebkit -skip qtwebkit-examples -skip qttranslations -icu -prefix "c:\dev\building_qt\bin\x86" -opensource -confirm-license -nomake tests -nomake examples
-no-angle — так как в моем проекте используется OpenGL “напрямую”, у меня возникли проблемы с ANGLE (http://qt-project.org/wiki/Qt-5-on-Windows-ANGLE-and-OpenGL). Если вкратце как я понял это дополнительная абстракция над API OpenGL, поэтому у меня и возникли проблемы с одноименными сущностями.
- -mp — то же что CL=/MP — для более быстрой компиляции
- -no-audio-backend — без встреонного wmf медиа-сервиса
- -opengl desktop — собрать с поддержкой opengl для настольных приложений
- -skip qtwebkit и -skip qtwebkit-examples — не портите себе настроение соберите их потом, это недочет разработчиков
- -skip qttranslations — я исключил потому что если взять версию icu версии 50 то lrelease.exe выкинет ошибку. Этот модуль на мой взгляд не так важен поэтому тоже соберем, но потом.
- -prefix «c:\dev\building_qt\bin\x86» — путь к собранным библиотекам
- -nomake tests -nomake examples — исключаем и экономим время (даже на моем рабочем компьютере сборка без webkit’а занимает 30 минут)
- Так же советую воспользоваться jom (http://qt-project.org/wiki/jom). Маленькая утилита которая распределяет работу nmake на потоки, количество которых равняется количеству ядер. Например у меня i7 c якобы 8 ядрами — соответственно потоков будет 8
- Можно прописать ее в путях и воспользоваться удобным редактором переменных окружения repidee ( www.rapidee.com/ru/about ). Не забываем перезапускать командную строку, что бы изменения вступили в силу
- И так сборка. Запускаем cmd.exe в корне папке распакованного архива и набираем:
vars32.bat && conf32.bat
Убеждаемся что у нас Qt настроен как нам нужно
- Продолжаем. Вбиваем:
если без webkit’a
jom && jom install
если все разом (и пойти спать)
jom && jom install && cd qttranslations && qmake && jom install && cd ..\qtwebkit && qmake && jom && jom install
- Запускаем qmake (из qtbase/bin) чтобы сконфигурировать какой-нибйдь модуль и получить makefile для nmake. Так можно к примеру скачать дополнительный модуль сконфигурировать и собрать.
- Для qttranslations не забываем про icu версии 51. Так же могу заметить, что приложения на Qt могут падать именно поэтому. Что бы проверить корректность работы icu можно например попробовать вызвать QTextCodec::codecForName(“CP1251”), если кодек удалось получить то все хорошо.
- Мне пришлось допиливать qtwebkit/bridge api — не работает передача параметров QtRuntimeObject из JS в C++, и видимо уже давно.
- Если приложение не запускается под XP, то нужно посмотреть зависимости через depends (http://www.dependencywalker.com/). Скорее всего забыли про msvcp110.dll и msvcr110.dll.
Спасибо за внимание! Надеюсь кому нибудь пригодится. Мое приложение замечательно работает.
ссылка на оригинал статьи http://habrahabr.ru/post/200474/
Добавить комментарий