воскресенье, 17 февраля 2013 г.

Сборка Qt5 из исходников компилятором MinGW (дубль два)

- Ок. Что вам нужно еще, кроме  чуда?
- Оружие. Много оружия.
Matrix (c)

Как и было обещано, в конце января увидел свет новый релиз Qt5, который уже полностью поддается компиляции MinGW, о чем было извещено в блоге Qt-project, а так же размещен на странице загрузки бинарный выпуск Qt5 совместно с MinGW (GCC 4.7). Парни сдержали и другое свое слово, снабдив штатную сборку версией MinGW с GCC поновее, чем версией 4.4. Итак, случилось чудо и всем, кто не желает время тратить на самостоятельную компиляцию библиотеки, ничего не мешает скачать подготовленный бинарник (кстати, уже с последней версией Qt Creator'а) и творить, творить .... :-). Остальным же предлагаю ознакомиться с моим "крестным путем" сборки Qt5, глядишь, что пригодится ;-). (Про сборку Qt4 Вы всегда можете прочитать тут.)
Пошагали...

1.  Скачиваем и устанавливаем одну из последних версий компиляторам MinGW. Обратите внимание - версия GCC должна быть не ниже 4.6. Если у Вас уже стоит MinGW, но более старой версии, можете вместо переустановки попробовать его обновить способом описанном тут. (Более подробно установка расписана в теме, посвященной сборке Qt4, сомневаетесь как и что нужно делать - прочтите, пожалуйста, там). Во время установки не забудьте выбрать для инсталляции пакет MSYS - он нам понадобится для сборки библиотек ICU).
Добавляем в переменную PATH путь до папки "bin" (например, если MinGW установлен в директорию "C:\MinGW", то в PATH добавляем путь "C:\MinGW\bin").

2. Скачиваем и устанавливаем одну из последних версий Python ветки 2.7 (именно 2.7, а не 3.3!). На момент написание этой заметки, это была версия 2.7.3.
Добавляем в переменную PATH путь до корневой папки установленного Python (например, "C:\Python27").

3. Скачиваем и устанавливаем одну из последних версий Perl, желательно не ниже 5.12. Если Вас обуревают сомнения какой дистрибутив использовать, воспользуйтесь версией "подготовленной" ActiveState (я всегда использую его).
Добавляем (если установщик не сделал это за Вас) в переменную PATH путь до папок "bin" (например, если Perl установлен в директорию "C:\Perl", то в PATH добавляем путь "C:\Perl\bin" и "C:\Perl\site\bin").

4. Скачиваем и устанавливаем одну из последних версий Ruby. Необходим для сборки "модуля" QtWebKit и, соответственно, всех остальных модулей использующих WebKit. Например, "модуль" Tools без него не соберется.
Добавляем в переменную PATH путь до папки "bin" (например, если Ruby установлен в директорию "C:\Ruby193", то в PATH добавляем путь "C:\Ruby193\bin").

5. Скачиваем исходные тексты библиотек ICU. Первый раз на этом сайте и не знаете что скачать? Не беда. Нам нужна версия ICU4C - нажимайте на самую первую ссылку в столбце под этой надписью (на момент написания заметки, это была 50.1.2). В открывшей странице листайте вниз до раздела "ICU4C Source Code Download" и уже там, внимание, выбирайте файл, для которого в description написано "gzipped tar archive for Unix and other platforms". Именно Unix, а не Windows.
5.1. Распаковываем скачанный архив в любую директорию не содержащую в пути пробелов. В моем случае это "C:\projects\icu".
5.2. Запускаем консоль MinGW (MinGW Shell, оно же MSYS) и переходим в директорию "source" библиотек ICU (в моем случае "C:\projects\icu\source"), например, такой командой:
cd /c/projects/icu/source
5.3. Запускаем скрипт конфигурирования сборки библиотек:
./configure
5.4. Компилируем библиотеки ICU:
make
Процесс не долгий - минут 10-15, далеко от компьютера не отходим :-). Почему именно версия для Unix и сборка под MSYS? А все потому, что только так MinGW именует библиотеки по формату принятому MinGW (читай GCC). Если Вы соберете из исходников для Windows, библиотеки соберутся и будут рабочие, да только MinGW не будет их "видеть" - придется вручную переименовывать.

6. Создаем новые системные переменные INCLUDE и LIB (или добавляем в уже существующие) со значениями:
- для INCLUDE - путь до папок "common" и "i18n" библиотек ICU. В моем случае значение системной переменной INCLUDE: "C:\projects\icu\source\common\;C:\projects\icu\source\i18n".
- для LIB - путь до директории "lib" библиотек ICU. В моем случае значение системной переменной LIB: "C:\projects\icu\source\lib".
Если не знаете как создать новые системные переменные - обратитесь к тексту предыдущей заметке о сборке Qt4 - там вы найдете ответ на свой вопрос.

7. Скачиваем и распаковываем в удобную Вам директорию исходные тексты библиотеки Qt5. Обратите внимание: путь с исходными текстами Qt5 должен быть как можно короче! Директорию, названную по-умолчанию "qt-everywhere-opensource-src-5.x.x", лучше заменить на что-нибудь вроде "qt5xx" и распаковать в корневую директорию диска (например, "C:\qt501"). Связано это с тем, что в некоторых местах сборки модулей библиотеки (особенно QtWebKit) формируются командные строки превышающие максимальную длину командной строки Windows (8191 символ). Видимо разработчики не учли это при переходе к "модульной" организации Qt, когда пришлось для компиляции модулей заменить относительные пути на абсолютные. Поэтому делайте все пути как можно короче - во избежании проблем. Это касается и для пути библиотек ICU - его тоже рекомендую сделать как можно короче - как вариант распаковать в корневую директорию ("C:\icu").

8. Конфигурируем библиотеку Qt5. Для этого запускаем командный процессор cmd.exe (он же "командная строка Windows" :-)), либо иную программу предоставляющую нам аналогичные возможности (например, Far), и переходим в корневую директорию Qt5. После чего запускаем конфигуратор библиотеки (configure.bat) с необходимы опциями сборки, например, такими:
configure -prefix %CD%\qtbase -opensource -debug-and-release -icu 
-nomake tests -opengl desktop
Тот, кто раньше уже собирал Qt из исходников, заметит, что добавилась одна "деталь" в духе Unix:
-prefix %CD%\qtbase
Это есть не что иное, как просто указание где хранится "ядро" библиотеки относительно текущей директории (да простят мне юниксоиды такую формулировку :-)).
Еще одна не маловажная деталь, опция:
-opengl desktop
Поскольку собирал я библиотеку только для использования на ПК. Кому нужна поддержка OpenGL ES придется "прикручивать" дополнительные библиотеки, имейте это в виду.

Отдельно стоит затронуть и опцию "-icu" (включена в конфигураторе по-умолчанию). В случае, если она указана, библиотека Qt5 будет собираться слинкованной с библиотеками ICU (собранными нами на шаге 5). Это означает, что готовые программы скомпилированные с использованием Qt5, будут требовать наличие этих библиотек ICU. Самый простой способ в данном случае, добавить путь к директории, где хранятся бинарные файлы библиотек, в системную переменную PATH (в моем случае, это "C:\projects\icu\source\lib", т.е. значение переменной LIB).
Напоминаю еще раз, библиотеки ICU нужны для сборки WebKit'а.

С остальными опциями Вы можете ознакомиться вызвав конфигуратор (configure.bat) с опцией "-h":
configure -h
Тем, кто собирает библиотеку впервые и не знает с чем имеет вообще дело (все мы через это проходили :-) ), рекомендую воспользоваться моими опциями сборки приведенными выше.

9. Собираем библиотеку Qt5. Если конфигуратор на предыдущем шаге никаких ошибок не выдал, значит смело набираем
mingw32-make.exe
и .... идем спать, гулять, в кино с девушкой .... ну вообщем есть время заняться чем-нибудь полезным или приятным :-). В зависимости от аппаратной части ПК, процесс сборки может занять до 10-11 часов. Ни о каких 1,5-3 часов, как некоторые пишут, и не мечтайте - это время уйдет только на сборку "ядра"+GUI (пользовательский графический интерфейс).

Мануал по сборке Qt5 был бы не полным без упоминания "модульности" сборки :-). Теперь, при желании, можно собирать только тот "модуль", который необходим. Обо всех зависимостях позаботится сама система сборки. Какие же это модули? А об этом Вы можете прочитать на официальном сайте библиотеки.

Внимание: если у Вас слишком длинные пути по которым располагаются библиотеки Qt и ICU, сборка QtWebKit у Вас "споткнется". Я очень надеюсь, что разработчики к следующей ревизии Qt что-нибудь придумают по этому вопросу. Пока же приходится "руками" собирать проблемные моменты.

10. Собираем документацию Qt5. В отличие от дистрибуции исходников Qt4, тут решили сборку документации переложить на пользователя.... что же делать ... собираем:
mingw32-make.exe docs
Идем пить чай-кофе :-). Время на сборку требуется, но не столь много как на сборку самой библиотеки.

11. The End. Приступаем к созданию шедевров!

На этом все. Тем кто переходит с Qt4 на Qt5, могу только посоветовать не забыть проинспектировать свой исходный код - местами произошли не значительные, но весьма "каверзные" изменения :-). И всех приглашаю на официальный форум команды Qt (имеется ветка и для русскоязычных участников!).

Пока!

P/S
Библиотека удачно собрана на двух машинах:
- Windows 7 x64 + MinGW win32 (GCC 4.7.2)
- Windows XP x86 + MinGW win32 (GCC 4.7.1)

14 комментариев:

  1. Собираем библиотеку Qt5.
    Можно запустить mingw32-make.exe с ключем -j X, при наличии нескольких ядер это позволит значительно сократить время сборки.

    ОтветитьУдалить
    Ответы
    1. Спасибо :-). Справедливый и нужный комментарий для владельцев многоядерных процессоров.

      Удалить
  2. А как быть с системными переменными QTDIR и QMAKESPEC, которые использовались для сборки четвертой версии? Их можно удалить или они нужны? И если нужны, то на что они должны содержать?

    ОтветитьУдалить
  3. Возможно первое сообщение не было опубиковано, поэтому спрошу еще раз. Чтом делать с перменными QTDIR и QMAKESPEC при сборке Qt5 ?? Их надо оставлять или можно удалить? Если надо оставлять, то что должно быть в них прописано?

    ОтветитьУдалить
    Ответы
    1. Добрый вечер!
      Комментарии сначала отправляются на премодерацию ;).
      QMAKESPEC можно смело удалить - теперь там один "профиль" для сборки Qt5 под Windows средствами MinGW.
      QTDIR - все так же - указать путь нахождения корневой директории Qt. В последний раз у меня было что-то вроде: C:\Qt\Qt5.2.0\5.2.0\mingw48_32

      Удалить
    2. Занятно... сегодня специально проверил на версии 5.2.1:
      QTDIR можно смело опускать, а вот QMAKESPEC следует указать. Либо при конфигурировании указать "-platform win32-g++"

      Удалить
  4. Здравствуйте. Пытаюсь по данной статье собрать Qt 5.3.1. Запускаю mingw32-make, начинается сборка, но через пару минут останавливается со следующей ошибкой:

    g++ -c -include .pch\debug\qt_pch.h -pipe -fno-keep-inline-dllexport -msse2
    ackrealign -mfpmath=sse -g -std=gnu++0x -fexceptions -mthreads -frtti -Wall
    tra -DUNICODE -DQT_NO_USING_NAMESPACE -DQT_BUILD_CORE_LIB -DQT_BUILDING_QT -
    T_SECURE_NO_WARNINGS -D_USE_MATH_DEFINES -DQT_ASCII_CAST_WARNINGS -DQT_MOC_C
    T -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_B
    E=0x040800 -DQT_USE_ICU -DPCRE_HAVE_CONFIG_H -DPCRE_STATIC -DQT_CORE_LIB -I.
    ..\..\include" -I"..\..\include\QtCore" -I"..\..\include" -I"..\..\include\Q
    e" -I"..\..\include\QtCore\5.3.1" -I"..\..\include\QtCore\5.3.1\QtCore" -I"t
    -I"global" -I"..\3rdparty\zlib" -I"..\3rdparty\pcre" -I"..\3rdparty\harfbuzz
    " -I"..\3rdparty\md5" -I"..\3rdparty\md4" -I"..\3rdparty\sha3" -I".moc\debug
    "..\..\mkspecs\win32-g++" -o .obj\debug\qcollator.o tools\qcollator.cpp
    In file included from tools\qcollator.cpp:43:0:
    tools\qcollator_p.h:49:26: fatal error: unicode/ucol.h: No such file or dire
    y
    #include
    ^
    compilation terminated.
    Makefile.Debug:12727: recipe for target '.obj/debug/qcollator.o' failed
    mingw32-make[4]: *** [.obj/debug/qcollator.o] Error 1
    mingw32-make[4]: Leaving directory 'd:/Development/qt5/qtbase/src/corelib'
    Makefile:38: recipe for target 'debug-all' failed
    mingw32-make[3]: *** [debug-all] Error 2
    mingw32-make[3]: Leaving directory 'd:/Development/qt5/qtbase/src/corelib'
    Makefile:133: recipe for target 'sub-corelib-make_first' failed
    mingw32-make[2]: *** [sub-corelib-make_first] Error 2
    mingw32-make[2]: Leaving directory 'd:/Development/qt5/qtbase/src'
    Makefile:41: recipe for target 'sub-src-make_first' failed
    mingw32-make[1]: *** [sub-src-make_first] Error 2
    mingw32-make[1]: Leaving directory 'd:/Development/qt5/qtbase'
    Makefile:63: recipe for target 'module-qtbase-make_first' failed
    mingw32-make: *** [module-qtbase-make_first] Error 2

    Я не могу понять, что пошло не так.
    P.S. Вообще мне нужно просто прикрутить OpenSSL к QWebView. Может есть способ сделать это без сборки Qt?
    Заранее спасибо.

    ОтветитьУдалить
    Ответы
    1. Доброго времени суток!

      Если Вы хотите собирать самостоятельно библиотеку Qt выше версии 5.0, то настоятельно рекомендую использовать для этого версию MinGW предлагаемую разработчиком на своем сайте. Она ОООЧЕНЬ серьезно в конфигах перекроена.

      На голой же MinGW так и будут постоянно вылетать всякие ошибки. Проверял сам на Qt 5.3.0.

      Удалить
    2. А вот касательно OpenSSL и QWebView ничего практического сказать не могу - не приходилось мне с этим работать. Но насколько я понял, штатная сборка уже собрана с поддержкой OpenSSL и единственное, что Вам нужно - это скачать бинарный дистрибутив OpenSSL и разбросать по нужным директориям хеадеры и библиотеки. Полезно будет почитать тут (где что скачать и куда бросить) и тут.
      И еще обратите внимание на переписку комрадов здесь. Где у пользователя все работает на 5.1, а на 5.3 программа рушится.

      Хотя, практика показывает, что лучше все библиотеки собирать одним компилятором и если есть возможность пересобрать все самому - лучше так и поступить :))))).

      Удалить
    3. Понимаю, что некропостинг, но вот осталось без комментария, что "fatal error: unicode/ucol.h" говорит о том, что исходники были настроены на сборку с ICU.
      Я для себя пока не выяснил, на сколько безболезненно сегодня (Qt-5.5.0) можно добавить опцию -no-icu.
      Но на http://wiki.qt.io/Qt-5-ICU говорят, что от нее отказываются.

      Удалить
  5. Попытался собрать c mingw32 на Windows XP SP3 (32 bit),...
    Все шло хорошо, даже configure.bat сработала, а вот mingw32-make встал: ошибка нет файла comdef.h.

    О каком файле идет речь, файл микрософт visual studio каталог vc\include? Если так, то он потянет за собой кучу includ-ов, поддерживающих OLE, последняя ошибка упирается Microsoft Visual Studio 10.0/VC/include/xstring:2010:27: error: 'const class std::basic_string, std::allocator >' has no member named '_Myres', ...

    Есть comdef на https://api.kde.org/kdesupport-api/kdewin-apidocs/comdef_8h_source.html, здесь отсутствуют функции для обработки ошибок типа Error, а именно: qwindowscontext.cpp: In function 'QString errorMessageFromComError(const _com_error&)':
    qwindowscontext.cpp:703:35: error: 'const class _com_error' has no member named 'Error'
    Как с этим совладать?
    С уважением, Радмир

    ОтветитьУдалить
  6. Прочитал статью и решил попробовать, все шло хорошо до шага mingw32-make. Этот не прошел, камнем преткновения оказался файл comdef.h Может авторы знают, где этот файл лежит и как его раздобыть?
    С уважением,
    Радмир

    ОтветитьУдалить
    Ответы
    1. Доброго времени суток!
      Извиняюсь, сейчас не часто получается бывать тут :)))

      Возможно, это следствие того, о чем я уже писал тут:
      http://codedchaos.blogspot.ru/2013/10/qt-511-gcc-mingw-481.html

      Суть такова, что Qt нужно собирать штатным компилятором, который идет вместе с исходниками от самих разрабов. Они там накатили ооочень много всяких патчей, которые переделали MinGW до неузнаваемости. После пару дней войны с чистым MinGW и Qt, я бросил это дело и, о чудо, Qt без запинки собрался штатным MinGW.

      Удалить