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

Параллельная компиляция Qt-проектов под Windows с использованием QtCreator - зверь загадочный и очень привередливый. В этой небольшой статье я расскажу, как же все-таки его приручить. Параллельная компиляция может быть выполнена достаточно просто в теории, на практике дела обстоят не совсем гладко, чему в подтверждение бесконечное число тем на форумах, где предлагаются всевозможные решения. Ни одно из них, к сожалению, нам не помогло.


В теории для случая MinGW достаточно указать параметр –j[число процессов компиляции] у команды сборки make, которая в QtSDK MinGW представлена mingw32-make. Например, получается команда mingw32-make.exe –j10.

Рекомендуемое число процессов компиляции составляет число процессоров+1. Если параметр не задается, то считается, что j=1. Если указать слишком большое число также ничего страшного не случится. Make запустит ровно столько, сколько дает прирост производительности.

Для удобства можно воспользоваться переменной окружения %NUMBER_OF_PROCESSORS%, которая показывает число процессоров в системе. Получается команда вида

Mingw32-make.exe –j%NUMBER_OF_PROCESSORS%

Однако, не все так просто. Qmake создает три make-файла. Общий Makefile, который по определенным define’ам выбирает из Makefile.Debug и Makefile.Release в зависимости от сборки релиза или дебага. Дело в том, что параметр –j не наследуемый . И когда в QtCreator вызывается make, то он вызывается для Makefile. А вот до Makefile.Debug или Makefile.Release уже не добирается.

Для того чтобы это исправить придется написать команду в явном виде . Например,

Mingw32-make.exe –j9 –f Makefile.Debug.

Не очень удобно, но прирост скорости сборки это сильно компенсирует. Для примера, пересборка нашего проекта на core-i7-2630 без распараллеливания осуществляется за 12 минут, с флагом –j9 сборка занимает менее двух минут. Прирост производительности в шесть раз заставляет задуматься.

Но даже после указания таких флагов сборки у нас на двух машинах это стало работать, а на двух нет. На форумах пишут, что дело может быть в версии Qt, в кривости mingw, в особенностях работы qmake, версии ОС. Однако, конфигурации наших машин таковы, что методом исключения можно сделать вывод о непричастности версий QtSDK, QtCreator, Windows или разрядности системы ко всему этому.

Решение оказывается очень простым, но в тоже время не таким очевидным. Нужно добавить абcолютный путь к mingw32-make в переменную окружения PATH. На всякий случай, лучше поставить точку с запятой после пути. И после этого чудесным образом начинает работать параллельная компиляция, а программистам не придется по 10 минут отвлекаться каждый раз при добавлении какого-нибудь Q_OBJECT к проекту и его пересборке.

Все эти флаги компиляции могут быть заданы в QtCreator на вкладке Проекты в параметрах make.

Надеюсь, статья окажется полезным и решит вопросы многих у кого до этого не работала параллельная сборка в QtCreator.

UPD (из комментариев) : Что касается Linux/MacOS пользователей, им повезло гораздо больше - достаточно только ключа -jX.

Также если вы используете компилятор MSVC, то проблем быть не должно.

В случае QtCreator нужно добавить запись
QMAKE_CXXFLAGS_RELEASE += -MP[число процессов]
в.pro файл проекта и установление переменной окружения как я описал.

В случае Visual Studio свойствах VS проекта: «Properties»=>«Configuration Properties»=>«C/C++»=>«Command Line». А в поле «Additional options» дописать -MP[число процессов]. Спасибо IGHOR

Также при использовании компилятора MSVC помочь может jom.

Постоянную часть флагов можно вынести в отдельную переменную окружения MAKEFLAGS. Make сам возьмет оттуда установленные флаги. К примеру MAKEFLAGS=-j10. А в параметрах make остается только не забыть указать файл для сборки. Например, -f Makefile.Debug. Если вы все время собираете одну версию, то можно вынести все флаги целиков в MAKEFLAGS и забыть про настройку будущих проектов.

Спасибо всем за дополнения.

Для меня в Windows 7 это было разрешено, щелкнув значок стрелки рядом с значком компьютера в левом нижнем углу экрана Qt Creator над зелеными стрелками, а затем дважды щелкнул компилятор в списке и перестроил проект.

2018-12-04T00:00Z

Когда я установил Qt в папку ~/Qt/ а затем вручную переименовал папку в нечто другое, у меня возникла аналогичная проблема. Когда я восстановил имя папки в исходном файле ~/Qt/ (указанном в установщике Qt), проблема исчезла; все было решено.

2018-12-11T00:00Z

У меня была аналогичная проблема при разработке на моем Mac -

Я пытался создать настольную разработку с создателем QT 3.3.0 на основе QT 5.4.0 (Clang 6.0 (Apple)) на OSX 10.9. Попробовав вручную изменить мои наборы для использования GCC, G ++ и CLANG. Я наконец нашел это очень простое решение:

Удалите файл xxx.pro.user и перезапустите QT Creator. Затем он автоматически подбирает ваши компиляторы / среды.

2018-12-18T00:00Z

* только для пользователей Windows *

Прежде чем перейти к следующим шагам, убедитесь, что у вас установлена ​​последняя версия Qt.

  1. Загрузите и установите minGW-64-bit из ссылки:
  2. Запомнить Каталог, в который вы устанавливаете minGW.
  3. Откройте создатель Qt и перейдите к инструментам -> параметры -> Сборка и запуск
  4. На вкладке «Компиляторы» выберите add -> MinGW ->
    Имя: MinGW
    path: Просмотр mingw-w64.bat (вы найдете этот файл в каталоге, в котором вы установили MinGW).
    ABI: x86 Windows msvc2015 pe 64bit

    Не забудьте применить свои изменения.

    Перейти в Kit -> добавить
    Имя: GCC
    Тип устройства: рабочий стол
    Устройство: локальный ПК (по умолчанию для рабочего стола)
    Компилятор: minGW
    Версия Qt: выберите новейшую версию

    Применить изменения и перезапустить qt

При создании нового проекта убедитесь, что вы используете GCC как комплект

Если он все еще не работает, щелкните значок компьютера внизу слева над кнопкой воспроизведения -> GCC -> Сборка

ИЛИ

Перейти к проектам (это в меню слева) -> Шаги сборки -> сделать -> Переопределить файл minGw31-make.exe -> перейти к пути, в котором вы установили minGW / bin \ mingw32-make.exe
Сделайте то же самое для чистых шагов тоже

Если u все равно получите любую ошибку после этих шагов, попробуйте установить переменные окружения

  1. Нажмите Win + Q
  2. Введите «Переменные среды»
  3. нажмите «Редактировать переменные системной среды»
  4. Свойства системы -> Advance -> Переменные среды
  5. Нажмите на путь (ПРИМЕЧАНИЕ. Используйте эти шаги очень осторожно и не возитесь с другими опциями )
  6. Нажмите править
  7. нажмите стрелку вправо, чтобы перейти к концу текста.
  8. введите полуточку (если она не находится в конце ее, потому что все системные пути отличаются точкой с запятой)
  9. paste path "MinGW_installation_directory \ bin" (В моем случае это было «G: \ Qt \ Tools \ mingw32 \ bin»). Убедитесь, что вы скопируете и вставьте путь CORRECT
  10. Нажмите «ОК» и примените изменения.

Это должно сделать это!!!

За информацией о платформах, на которых в настоящее время Qt можно запустить, а за дополнительной информацией о статусе каждой платформы - к странице Поддерживаемые платформы .

Если у вас есть что добавить в этот список или для какой-либо платформы или на страницу конкретного компилятора, пожалуйста передайте это через Форму отчета об ошибке или через Общественное хранилище Qt .

Поддерживаемые возможности

Не все используемые для сборки Qt компиляторы способны скомпилировать все модули. Следующая таблица показывает поддержку компиляторов для пяти модулей, которые не доступны одновременно для всех платформ и компиляторов.

Компилятор Свойства
Concurrent XmlPatterns WebKit CLucene Phonon
g++ 3.3 X X X
g++ 3.4 и выше X X X X X
SunCC 5.5 X X
aCC series 3 X X
aCC series 6 X X X X X
xlC 6 X X
Intel CC 10 X X X X X
MSVC 2003 X X X X
MSVC 2005 и выше X X X X X

GCC

GCC под Windows (MinGW)

Мы тестировали Qt с этим компилятором на Windows XP. Минимальная поддерживаемая версия MinGW:

  • GCC 3.4.2
  • MinGW runtime 3.7
  • win32api 3.2
  • binutils 2.15.91
  • mingw32-make 3.80.0-3

Замечание: Для пользователей бинарного пакета MinGW: Этот пакет теперь основан на MinGW 4.4. Установщик более не предлагает вам скачать MinGW, но наоборот предлагает использовать версию MinGW, которая уже установлена на вашей машине. Вы только сообщите установщику в каком каталоге установлен MinGW. Если вы еще не установили MinGW 4.4, вы можете скачать архив.zip с нашего ftp-сервера . Этот архив предоставит исправления для MinGW и поддержку отсутствующих API, За подробностями обращайтесь к каталогу _patches в архиве.

Замечание: Установка MinGW необходима только для сборки бинарного пакета вместо запуска предварительно скомпилированных бинарных файлов, которые находятся в пакете.

GCC 4.0.0

Выпущенный пакет компилятора содержит несколько ошибок, которые приводят к ошибкам компиляции. Мы рекомендуем использовать gcc 4.0.1 или старше, или использовать свежий срез CVS ветки gcc 4.0. Версия gcc 4.0.0, которая идет вместе с Mac OS X 10.4 "Tiger", работает с Qt для Mac OS X.

HP-UX

Платформа hpux-g++ тестировалась с gcc 3.4.3.

Solaris

Пожалуйста, используйте GCC 3.4.2 или более свежую.

Mac OS X

Пожалуйста, используйте последний GCC 3.3 от Apple или свежие версии GCC 3. gcc 3.3, который поставляется вместе с Xcode 1.5, генерирует код с дефектом. Используйте исправление GCC 3.3 от ноября 2004, доступное в Apple .

GCC 3.4.6 (Debian 3.4.6-5) на AMD64 (x86_64)

При создании релиз-сборки этот компилятор компилирует с ошибкой некоторые части Qt. Имеется несколько методов обхода:

  1. Используйте отладочную сборку.
  2. Для каждой встретившейся ошибки компиляции перекомплируйте файл без опции -O2.
  3. Добавьте -fno-gcse в QMAKE_CXXFLAGS_RELEASE .

HP ANSI C++ (aCC)

Платформы hpux-acc-32 и hpux-acc-64 тестировались с aCC A.03.57. Платформы hpuxi-acc-32 и hpuxi-acc-64 тестировались с aCC A.06.10.

Intel C++ Compiler

Qt поддерживает компилятор Intel C++ и для Windows и для Linux. Однако, имеется несколько проблем под Linux (смотрите следующий раздел).

Intel C++ Compiler для Linux

В настоящее время Nokia тестирует следующие компиляторы:

  • Intel(R) C++ Compiler для приложений, запускаемых на IA-32, версия 10.1 Build 20080602 Package ID: l_cc_p_10.1.017
  • Intel(R) C++ Compiler для приложений, запускаемых на Intel(R) 64, версия 10.1 Build 20080602 Package ID: l_cc_p_10.1.017

В настоящее время мы не тестируем компилятор IA-64 (Itanium).

Известные проблемы с Intel C++ Compiler для Linux

  • Поддержка предварительно скомпилированных заголовков не работает в версии 10.0.025 и более старых. Для этих компиляторов вы должны сконфигурировать Qt с опцией -no-pch. Поддержка предварительно скомпилированных заголовков работает в версии 10.0.026 и более поздних.
  • В версии 10.0.026 для Intel 64 известна ошибка компиляции qmake при создании релиз-сборки. Пока конфигурируйте Qt с опцией -debug. Версия 10.1.008 и более поздние могут компилировать qmake в режиме релиза.
  • Для версий с 10.1.008 по 10.1.015 для IA-32 и Intel 64 известен фатальный сбой с сообщением "(0): internal error: 0_47021" при компиляции QtXmlPatterns , QtWebKit и Designer в режиме релиза. Версия 10.1.017 компилирует эти модули в режиме релиза правильно.

Intel C++ Compiler (Windows, Altix)

Qt 4 был успешно протестирован с:

  • Windows - Intel(R) C++ Compiler для 32-битных приложений, Version 9.1.040.
  • Altix - Intel(R) C++ Itanium(R) Compiler для приложений базирующихся на Itanium(R) версия 8.1 Build 20050406 Package ID: l_cc_pc_8.1.030

В настоящее время тестируются компилятор Intel только для 32-битных версий Windows.

MIPSpro (IRIX)

Qt 4.4.x требуется MIPSpro версии 7.4.2m.

Обратите внимание на то, что MIPSpro версии 7.4.4m в настоящее время не поддерживается, так как в ней имеется несколько проблем, которые еще не исправлены. Мы рекомендуем использовать для разработки Qt версию 7.4.2m. Однако, пожалуйста обратите внимание на неподдерживаемый статус этой платформы.

Forte Developer / Sun Studio (Solaris)

Sun Studio

Qt тестировалась с использованием Sun Studio 12 (Sun CC 5.9). Перейдите на страницу Sun Studio Patches на веб-сайте Sun, чтобы скачать последние исправления для вашего компилятора Sun.

Пожалуйста, обратите внимание на то, что Qt 4.6 требовательна в своих требованиях к STL и что стандартная реализация STL, используемая Sun CC, не удовлетворяет этим требованиям. Это не влияет на бинарную совместимость и вы можете продолжать использовать STL в вашем коде, но функции Qt совместимости с STL будут блокированы.

Sun CC поставляется со вторичной реализацией STL (называется stlport4), которая соответствует стандартам и может быть использована Qt. Вы можете разрешить это передав опцию -library=stlport4 компилятору. Обратите внимание на то, что это не скажется на бинарной совместимости Qt, но может повредить другим библиотекам и программам, использующим STL.

Sun WorkShop 5.0

Sun WorkShop 5.0 не поддерживается с Qt 4.

Visual Studio (Windows)

Вы делали большую часть разработки под Windows на Windows XP, используя Microsoft Visual Studio .NET 2005 и Visual Studio 2008 (как 32-, так и 64-битные версии).

Qt работает с Visual Studio 2005 Standard Edition, Professional Edition и Team System Edition.

Мы также тестировали Qt 4 на Windows XP с Visual Studio .NET и Visual Studio 2003.

Для того, чтобы использовать Qt с Visual Studio 2005/2008 Express Edition вам необходимо скачать и установить Platform SDK. Из-за ограничений в Express Edition мы не смогли установить Qt Visual Studio Integration. Вам нужно использовать наши инструменты командной строки для сборки приложений Qt с помощью этой редакции.

Visual C++ Linker не понимает имена файлов с пробелами (такие как C:\Program files\Qt\), поэтому переместите её в другое место, или явно установите путь; например:

QTDIR=C:\Progra~1\Qt

Если вы встретите странные проблемы с использованием специальных флагов, модифицирующих выравнивание структуры и членов объединения (таких как /Zp2), тогда вам нужно также перекомпилировать Qt с флагами, установленными для приложения.

Если вы используете Visual Studio .NET (2002) Standard Edition, вы должны использовать предоставляемые бинарные пакеты Qt, а не пакеты исходного кода. Так как Standard Edition не оптимизирует компилируемый код, ваша скомпилированная версия Qt будет выполняться квазиоптимально с усреднением по скорости.

IBM xlC (AIX)

Утилита makeC++SharedLib должна быть в вашей переменной PATH и соответствовать сборке разделяемых библиотек. Из Красной книги IBM C and C++ Application Development on AIX :

  • "Второй шаг - используйте команду makeC++SharedLib для создания разделяемого объекта. Команда имеет много необязательных аргументов, но в простейшей форме может использована как изложено ниже:" /usr/vacpp/bin/makeC++SharedLib -o shr1.o cplussource1.o
  • "Полный путь к команде не рекомендуется; однако, чтобы обойти это добавьте каталог, в котором находится ваша переменная окружения PATH. Команда находится в /usr/vacpp/bin directory вместе с VisualAge C++ Professional for AIX, Version 5 compiler."

VisualAge C++ для AIX, версия 6.0

GCCE (Symbian)

GCCE нельзя использовать для компиляции библиотек Qt для платформы Symbian, но GCCE поддерживается при компиляции приложений Qt для платформы Symbian.

Для быстрой разработки кроссплатформенных приложений весьма просто ставится в Linux, но в Windows с ним приходится немножко повозиться.

С сайта Nokia можно скачать уже скомпилированную библиотеку, но в предлагаемом виде она удобна разве что поиграться долгими зимними ночами. Дело в том, что функции, хранящиеся в файле с раширением dll (динамически подключаемые библиотеки) могут присоединяться к конечной программе двумя способами. Первый способ называется динамическим (dynamic). При его использовании код функций остается в dll’ке, благодаря чему размер скомпилированной програмы достаточно мал. Но при переносе экзешника на другой компьютер понадобится тащить и dll, суммарный размер которых в случае с Qt как правило больше 100 МБ. Второй метод компиляции - статический (static). При его использовании надобность в отдельных библиотеках отпадает: код необходимых функций встраивается непосредственно в exe-файл. И надо ж было сделать, что предлагаемый инсталлятор Qt SDK поддерживает только динамическую линковку библиотек. Чтобы исправить ситуацию нужно перекомпилировать Qt, чем сейчас и займемся.

Загрузка компонент

По ссылке http://qt.nokia.com/downloads выбираем лицензию GPL и смотрим на колонку, озаглавленную Qt: Framework Only . Можно использовать компилятор Visual Studio, но более общим может показаться компиляция с помощью MinGW - аналога gcc под Windows, которая дальше и будет рассматриваться. О компиляции с помощью Visual Studio можно узнать по следующей ссылке: http://qt.nokia.com/doc/4.6/install-win.html . Итак, переходим по соответствующей ссылке и качаем файл, содержащий в названии слово «src». Полученный архив распаковываем в C:\Qt\, где - номер скачанной версии Qt, 4.6.0 в моем случае (далее этот путь будет обозначен как ). Иной каталог выбирать не стоит, так как говорят , что в иных каталогах компиляция обламывается.

Для дальнейшей комфортной работы также понадобится Qt Creator, доступный по вышеприведенной ссылке на сайт Нокии.

Так же грузим онлайн-инсталлятор MinGW отсюда: . Установим его, например, в C:\MinGW (далее этот путь будет обозначен как ). Отсюда же грузим отладчик gdb последней версии. Из архива tar.gz или tar.bz2 извлекаем каталог bin\ в .

Компиляция

Так как нам нужна статическая линковка, в файле QTDIR\mkspecs\win32-g++\qmake.conf находим строку, по виду подобную
QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
и дописываем после равно ключ -static:
QMAKE_LFLAGS = -static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc

Update 26/03/2013. Версия Qt 5.0.1 требует установленного в системе интерпретатора Perl и Python. Для этого был установлен Strawberry Perl и Python 2.7 , а батник, описываемый ниже, был модифицирован.

В каталоге QTDIR создадим батник с именем QtInstall.bat, устанавливающий необходимые переменные окружения со следующим содержимым:

SET QTDIR=c:\Qt\5.0.1\ SET MINGWDIR=c:\MinGW\ SET QMAKESPEC=win32-g++ SET PERLDIR=c:\strawberry\perl\ SET PYTHONDIR=c:\Python27\ SET PATH=%QTDIR%\bin;%MINGWDIR%\bin;%PERLDIR%\bin;%PYTHONDIR%;%SystemRoot%\System32

Запустим его. Конфигуратор компилятора запускается командой configure в открывшейся консоли. Полный список её параметров вызывается ключом -help:
configure -help
Я использовал следующие ключи:
configure -debug-and-release -static -no-exceptions -no-accessibility -qt-libtiff -qt-libmng -qt-libjpeg -qt-sql-sqlite

Update 26/03/2013. Для версии 5.0.1 использовалась команда configure -debug-and-release -static -no-accessibility -opensource -qt-libjpeg -qt-libpng -qt-sql-sqlite -nomake examples -opengl desktop
Добавление ключа -qt-sql-mysql привело к ошибке компиляции.
Конфигуратор предложит выбрать лицензию, согласиться с ней и пошебуршит минут 10-20.

Теперь можно начинать компиляцию командой
mingw32-make
Она потребует порядка 25 ГБ свободного места на диске и около 10 часов машинного времени на не очень сильных машинах. Большую часть указанных гигабайт занимают примеры, которые тоже будут компилироваться, при чем в двух вариантах: отладочный (будет лежать в каталоге debug\ внутри каталога с примером) и релизный (каталог release\ там же). Отладочные в среднем весят около 100 МБ и в примерах совершенно не нужны. Почистив от них каталоги \examples и \demos конечный размер уменьшится до 8,5 ГБ.