пятница, 3 августа 2012 г.

Сборка Qt из исходников компилятором MinGW

С самого первого своего знакомства с Qt меня не покидало желание самостоятельно скомпилировать эту библиотеку. Однако, постоянно отпугивали возможные сложности связанные с этим процессом - настройка среды, предварительная конфигурация и т.д. и т.п. Достаточно проще было взять на сайте уже бинарный пакет и клепать свои "калькуляторы" :-). Но в один момент "небеса разверзлись" и "перст указующий" дал понять, что пользоваться компилятором GCC 4.4 уже не модно и пора переходить на версию поновее. Тут то и пришлось снова вернуться к идее самостоятельной компиляции Qt, поскольку бинарная версия с сайта (собранная GCC 4.4) наотрез отказывалась работать с последней версией MinGW (оно то и понятно - GCC 4.6). Как оказалось, процесс этот несложный, поэтому я и решил поделиться своим HowTo с такими же страждущими как я - дабы не пугались они "гнева праведного".... т.е. сложностей, а экспериментировали и развивались :-).
Приступим...
MinGW. Выбор пакетов для установки

1. Первое, что необходимо сделать это, конечно же, скачать и установить компилятор MinGW. Для этого стоит посетить официальный сайт и скачать online установщик. Запустив его, в принципе, никаких сложностей с установкой быть не должно. На что необходимо только обратить внимание "новичков в этом деле": 1) установщик предлагает пользователю (да-да, Вам :-)) выбрать каким репозиторием пользоваться - актуальным на момент создания инсталлятора ("use pre-packaged repository catalogues"), или самым последним ("download latest repository catalogues") - тут выбирайте сами (я выбираю всегда самую последнюю версию); 2) в момент выбора пакетов для установки - не забудьте отметить пакет C++, а так же дополнительные пакеты MSYS Basic System и MinGW Developer ToolKit (никогда не знаешь, что может понадобиться в следующий момент ;-)).

И помните: НИКАКИХ ПРОБЕЛОВ В ПУТЯХ!

Если же сомневаетесь в правильности своих действий, Вы всегда можете посетить очень информативную страничку из ВиКи MinGW посвященную вопросу установки - ТУТ.

После установки MinGW, не забудьте добавить в переменную среды PATH полный путь до папки "bin" (так, если MinGW установлен в папку C:\MinGW, то в переменную PATH необходимо добавить путь C:\MinGW\bin). Только будьте предельно осторожны - не заменить содержимое, а именно добавить! Если затрудняетесь с поиском этой самой переменной PATH ;-), обратитесь к шагу 3 - это подтолкнет Вас в нужном направлении.

2. Со страницы загрузки Qt скачать архив с исходными текстами и разархивировать его в любую понравившуюся директорию (не забывайте, что тут путь так же не должен содержать пробелов). В моем случае это была директория Qt на диске "C" (C:\Qt\qt-everywhere-opensource-src-4.8.2). 

Окно "Переменные среды"
3. Задать переменные среды QMAKESPEC и QTDIR. Сделать это можно двумя способами:
===1) (рекомендую) в соответствующем окне "Переменные среды"
(кто не знает где его искать:
Пользователи Windows XP - ПКМ на иконке "Мой компьютер" меню "Свойства", в появившемся окне выбираем вкладку "Дополнительно" и ищем там кнопку "Переменные среды...";
Пользователи Windows 7 - ПКМ на иконке "Мой компьютер" меню "Свойства", в появившемся окне выбираем слева меню "Дополнительные параметры системы" и далее, аналогично, вкладка "Дополнительно" и кнопка "Переменные среды...").
===2) непосредственно перед выполнением команд описанных на шаге 4, задать в командной строке путем ввода команд:
SET QMAKESPEC=значение
SET QTDIR=значение
Учтите, что данный способ задаст переменные среды на время существования консоли и при повторной сборке/реконфигурации библиотеки Qt, Вам придется вводить их заново.

Осталось только определится какие же значения необходимо задать для указанных переменных. Для QTDIR это полный путь нахождения корневой директории Qt (в моем случае, это "C:\Qt\qt-everywhere-opensource-src-4.8.2"). А вот QMAKESPEC должен содержать имя профиля сборки. Для выбранного компилятора MinGW, в арсенале Qt существуют два профиля: "win32-g++" - для версий компилятора GCC ниже 4.6, и "win32-g++-4.6" - для версий компилятора GCC 4.6 (задействован в последних версиях MinGW). Как видно из наименования профиля, оно складывается из двух частей - имени платформы и имени компилятора (ну это уже так ... справочно :-), а особо интересующиеся могут ознакомиться с полным перечнем возможных профилей в директории mkspecs).

4. Сконфигурировать библиотеку Qt.
Для этого необходимо в командной строке перейти в корневую директорию Qt (в моем случае "C:\Qt\qt-everywhere-opensource-src-4.8.2") и вызвать программу "configure.exe"  с интересующими опциями, исчерпывающий перечень которых, с кратким описанием, Вы можете получить вызвав "configure.exe" c опцией "-?". Но если Вы не понимаете с чем связались :-), то смело можете запускать конфигуратор безо всяких опций - он сконфигурирует библиотеку "по-умолчанию" (как это видется "создателям").
Процесс компиляции библиотеки долгий, поэтому некоторые программисты, дабы сократить время сборки, в момент конфигурации указывают опции отменяющие компиляцию программ демонстрации и различных примеров. Если Вы чувствуете, что это "добро" и Вам  не понадобиться, смело "кормите" конфигуратору: -nomake demos -nomake examples.
В качестве демонстрации, как это выглядит в живую, приведу свой перечень опций конфигурирования библиотеки Qt:
configure.exe  -debug-and-release -qt-libpng -qt-libjpeg -opensource 
-no-qt3support -qt-zlib -qt-libmng -qt-libtiff 
-nomake demos -nomake examples
Конечно же, все это необходимо набирать в одну строчку ... так ... на всякий случай ;-).

Обратите внимание на опцию -opensource, что, как не трудно догадаться, означает согласие использовать Open Source редакцию Qt, которая лицензируется под лицензиями GPL v.3, либо LGPL v. 2.1. Если Вами не будет указана соответствующая опция, то конфигуратор первым же вопросом захочет узнать Ваш выбор редакции - open source либо коммерческой (ну это не про нас :-)). Не забудьте следом подтвердить и свое согласие с указанными "свободными" лицензиями ;-).

После того, как Вы ответите на все вопросы, конфигуратор создаст ключевой файл qmake.exe и makefile'ы модулей библиотеки Qt. Окончание этого процесса ознаменуется сообщением:
Qt is now configured for building. Just run mingw32-make.
To reconfigure, run mingw32-make confclean and configure.
и Вам только останется перейти к шагу 5...

5. Собрать библиотеку Qt.
Самый дли-и-и-и-и-и-ительный по времени выполнения пункт этой "инструкции" - компиляция библиотеки Qt. Все что нужно сделать на этом шаге - это набрать в командной строке:
mingw32-make
откинуться на кровать или пойти погулять, ибо времени на весь процесс уйдет несколько часов. Так на моем 2-х ядерном Атлоне с 4 Гб ОЗУ потребовалось порядка 7 часов.
В некоторых других "мануалах", Вы можете увидеть рекомендацию компилировать только цель sub-src:
mingw32-make sub-src
что оправдано в случаях, когда Вы будете использовать "чисто библиотеку" (яркий тому пример - связка с MS Visual Studio). Но если же Ваша работа, к слову, будет протекать в том же Qt Creator'е, то Вам понадобятся дополнительные утилиты, которые при сборке цели "sub-src" не компилируются. Да и выгода по времени - буквально несколько минут. Поэтому, можно особенно не загоняться и компилировать все.
В качестве рекомендаций к данному шагу хотел бы посоветовать Вам отключить антивирусы и прочие средства защиты, иначе они могу стать неожиданным источником проблем компиляции.

На этом все. Радуемся, что все получилось (надеюсь) и приступаем к созданию своих "эпических" программ ;-)))).

Upd: тема сборки Qt5 затронута тут.

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

  1. Спасибо за ликбез.

    Хотелось бы ещё почитать:
    про сборку документации для QT
    про очистку каталога QT после сборки от лишних файлов
    про опцию отключения WebKit(время компиляции)
    про опцию каталога установки и mingw32-make install

    ОтветитьУдалить
    Ответы
    1. Всегда пожалуйста :-)

      про сборку документации для QT
      Никогда даже не задавался таким вопросом, поэтому рассказать что-то не смогу. А зачем ее вообще собирать, если она идет сразу в удобном виде в папке doc? По крайней мере, Qt Creator нормально с ней работает.

      про очистку каталога QT после сборки от лишних файлов
      А вот это можно сделать по-сути только вручную :-) - поудалять бинарные файлы *.o. Хотя они могут серьезно сократить время повторной сборки Qt (ну если потребуется). (MinGW32-)Make install, который в Linux позволяет установить в нужную директорию программу, на Windows не работает, поэтому и mingw32-make clean тоже стоит использовать с осторожностью - он оставляет только версии *.DLL. В тоже время некоторые пишут, что линкер прекрасно и с dll связывает приложения, не требуя библиотек *.a (справедливо, конечно, для shared версии Qt). Ради эксперимента проверял - Hello, World! работал, но это, конечно, не показатель :-).

      про опцию отключения WebKit(время компиляции)
      Для этого конфигуратору нужно передать опцию -no-webkit

      про опцию каталога установки и mingw32-make install
      См. выше п.2.

      Удалить
  2. Спасибо за краткость.
    Вот только одну загвоздку нужно тоже учесть в статье. Если установлена VS, то переменные среды %include% и %lib% смотрят на Microsoft. В свою очередь, сonfigure смотрит на эти переменные и добавляет их в Makefile проектов. Это мешает собирать под MINGW.

    ОтветитьУдалить
    Ответы
    1. И Вам пожалуйста :-)

      Это справедливо не только для VS, но и для любого другого компилятора, который создает данные переменные. Например, в свое время, Open Watcom потрепал мне нервы задав их :-).
      Возможно и стоило затронуть этот вопрос в заметке... но теперь он уже раскрыт в комментариях благодаря Вам, так что страждущие, полагаю, найдут ответ на свой вопрос ;-).

      Удалить
  3. Не удалось выполнить 4 шаг. Сообщения о то, что можно теперь запустить make не появляется. В принципе при запуске configure.exe в консоль выдается лишь описание его ключей и ничего не происходит.
    Я пытался собрать под mingw64 и, если это важно, он у меня не установлен, а скопирован, потому как автоматический установщик не предлагает мне 64-х битную версию.
    Может посоветуете мне, что-нибудь?

    ОтветитьУдалить
    Ответы
    1. Ну для начала ... официальный проект MinGW не выпускает компилятор x64, а только x86 - поэтому он Вам и не предлагает установить то, чего нет ;-). Все версии MinGW x64, что есть в сети - это сторонние проекты.

      Далее - MinGW можно и просто скопировать, главное потом указать в переменной PATH где он находится (к слову, ранее его так и устанавливали - скачивали архивы и прописывали путь в PATH). Правда, если там есть и пакет MSYS, то придется корректировать и файл fstab.

      Про сборку Qt x64 под Windows ... была мысль попробовать собрать, но там очень много заморочек. На текущий момент ни один известный мне пакет MinGW x64 этого сделать не может. Нужно "допиливать" сначала сам toolchain, а уж потом собирать Qt. Если Вы все же заинтересованы именно в 64-битной версии Qt, советую ознакомиться вот с ЭТИМ материалом :-).

      Удалить
  4. Спасибо за гайд, собралось без проблем

    ОтветитьУдалить
  5. При компиляции наткнулся на ошибку:
    g++ -c -pipe -O2 -frtti -fexceptions -mthreads -Wall -Wextra -DUNICODE -DQT_BOOTSTRAPPED -DQT_LITE_UNICODE -DQT_NO_C
    AST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_CODECS -DQT_NO_DATASTREAM -DQT_NO_GEOM_VARIANT -DQT_NO_LIBRARY -DQT_NO_
    QOBJECT -DQT_NO_STL -DQT_NO_SYSTEMLOCALE -DQT_NO_TEXTSTREAM -DQT_NO_THREAD -DQT_NO_UNICODETABLES -DQT_NO_USING_NAMES
    PACE -DQT_NO_DEPRECATED -DQT_NODLL -I"..\..\..\include" -I"..\..\..\include\QtCore" -I"..\..\..\include\QtXml" -I"..
    \..\3rdparty\zlib" -I"..\..\..\mkspecs\win32-g++" -o tmp\obj\release_shared\qisciicodec.o ..\..\corelib\codecs\qisci
    icodec.cpp
    g++.exe: error: ....corelibcodecsqisciicodec.cpp: No such file or directory
    g++.exe: fatal error: no input files

    Вылечил правкой mkspecs\win32-g++\qmake.conf
    ....
    #!isEmpty(QMAKE_SH) {
    MINGW_IN_SHELL = 1
    QMAKE_DIR_SEP = /
    QMAKE_QMAKE ~= s,\\\\,/,
    QMAKE_COPY = cp
    QMAKE_COPY_DIR = cp -r
    QMAKE_MOVE = mv
    QMAKE_DEL_FILE = rm
    QMAKE_MKDIR = mkdir -p
    QMAKE_DEL_DIR = rmdir
    QMAKE_CHK_DIR_EXISTS = test -d
    #} else {
    # QMAKE_COPY = copy /y
    # QMAKE_COPY_DIR = xcopy /s /q /y /i
    # QMAKE_MOVE = move
    # QMAKE_DEL_FILE = del
    # QMAKE_MKDIR = mkdir
    # QMAKE_DEL_DIR = rmdir
    # QMAKE_CHK_DIR_EXISTS = if not exist
    #}
    ...
    Т.е. закомментировал кусок.

    Для ускорения сборки можно указывать у make опцию -j например mingw32-make -j4 будет молотить в 4 потока. И соберет все почти в 4 раза быстрее.

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

      С похожей ошибкой (отсутствующий файл) я сталкивался в ситуации, когда "строка компиляции" превышала максимальный лимит (порядка 8 тыс. символов в Windows) - командный процессор тупо отрезал все что больше. Может это происходит и в вашем случае?

      А с распараллеливанием сборки я не спорю:))
      Правда на практике иного возникают определенные нюансы, как то, прерывание компиляции при использовании "чистого" MinGW. Все же это из разряда "системной" оптимизации сборки приложений на многоядерных/многопроцессорных системах и об этом следует говорить отдельно, ИМХО :))))

      Удалить