Как скомпилировать на нескольких ядрах с помощью mingw внутри QTCreator

У меня есть четырехъядерный процессор i7 на моем рабочем столе windows. Я пытаюсь получить mingw32-make для компиляции, используя как можно больше ядра. Я добавил -j8 в поля "сделать аргументы" в разделе настройки сборки->шаги сборки. mingw32-make, похоже, полностью игнорирует этот вариант, так как я не получаю никакого улучшения скорости. Когда я просматриваю использование ЦП в диспетчере задач,он остается на 13%, и я вижу только один экземпляр G++.

прямо сейчас, перестраивая весь проект с помощью mingw занимает 3 минуты. Восстановление с помощью MSVC занимает всего 15 секунд.

для вашей информации я включил опцию предварительно скомпилированного заголовка в настройках проекта. Это делает вещи намного быстрее с VC, а также. Но я все еще не вижу преимущества предварительно скомпилированного заголовка с mingw.

пожалуйста, поделитесь своими комментариями, Если вы когда-либо получили mingw для компиляции нескольких исходных файлов параллельно с QTCreator. Спасибо!

7 ответов


вот что я сделал.

в меню Сервис - > Параметры в Qt Creator в разделе" сборка и запуск "есть опция, которая говорит"использовать jom вместо nmake". Я проверил этот ящик, но ничего не изменилось. Поэтому вместо этого я пошел в настройки сборки проекта, и в категории "шаги сборки" есть элемент "сделать". Разверните сведения об этом, и вы найдете "Override mingw32-make.ехе:" пункт. Я расклеил "C:\QtSDK\QtCreator\bin\jom.exe " там, и вдруг я строил с несколько ядер.

работал для меня на Qt Creator 2.4.1. Попробуй.


-j8 вероятно, не работает из-за ограничения в GNU Make на Win32.

попробуйте положить просто -j в поле make arguments. Это говорит, что Make порождает как можно больше процессов компиляции-если у вас достаточно ОЗУ и процессора для обработки этого, это должно быть быстрее, чем одна компиляция.

к сожалению, это только два варианта (без изменения файлов Makefile): либо -j1, или неограниченного -j

полная информация: GNU Make on Win32 не поддерживает сервер заданий, поэтому родительский процесс Make не может отслеживать количество процессов компиляции, порожденных любыми суб-Make. Чтобы быть в безопасности, sub-Make работает только с -j1. Я считаю, что созданные создателем qmake / Qt Makefiles используют несколько слоев Makefiles. Я впервые понял эту проблему с MPLAB X IDE микрочипа, проверьте этой теме дополнительная информация

эта цитата из README.W32 распространяется с GNU Make

поддержка параллельные сборки

параллельные сборки (- jN) поддерживаются в этом порту, с 2 ограничения:

  • число параллельных процессов имеет жесткий предел 64, из-за того, как этот порт реализует ожидание его подпроцессы;

  • метод сервера заданий (доступен при запуске Make в Posix платформ) не поддерживается, что означает, что вы должны пройти явные -ин переключиться на sub-Make в рекурсивном файле Makefile. Если sub-Make не получает явный переключатель-jN, он будет по умолчанию - j1, т. е. нет параллелизма в sub-Make.


добавить -j9 (вместо 9 значению NUMBER_OF_PROCESSORS(Windows)/$(nproc)(Linux) плюс один-это оптимально) для всех

QString makefilein = " -f " + subtarget->makefile;

строки qmake\generators\makefile.cpp (найдите его сами).

это приводит как

QString makefilein = " -j9 -f " + subtarget->makefile;
выполнить configure.exe с правильными параметрами (!и дополнительные -qmake -dont-process чтобы избежать поколения изобилия makefiles!).

проблема в том, что вы получаете два набора процессов во время сборки "debug and release". Таким образом, общее количество порожденных процессов составляет 18+.


использовать MAKE_COMMAND переменные среды:

set MAKE_COMMAND=mingw32-make -j%NUMBER_OF_PROCESSORS%

в Qt Creator перейдите к проектам - > Build & Run - > your specific MinGW build setup - > Build Environment (это находится на экране ниже общих / шагов сборки / чистых шагов..) а затем добавьте переменную MAKEFLAGS и установить его в -j8. Я протестировал это на своей двухъядерной машине с -j4 и QtCreator 4.4.1 и с MinGW 5.3.0. При компиляции мой процессор работает со 100% производительностью, как видно из Диспетчера задач. Без этой опции это было около 25 %, поэтому я предполагаю, что он работает точно так, как ожидалось. Сборка теперь намного быстрее.


-j-это путь, к сожалению, для меня проект настолько велик, что он использует всю мою доступную память, и мой компьютер зависает, поэтому знайте об этом. Брендан сказал, что нет способа использовать только половину ваших ядер, например, жаль, если это правда.


проблема в том, что исходный make не имеет поддержки jobserver. Так что в порту mingw32 его тоже не было. Однако с тех пор он был добавлен. Я считаю, что самая старая версия с "правильной" поддержкой jobserver-3.82.90. Вы можете найти по ссылке ниже.

http://sourceforge.net/projects/mingw/files/MinGW/Extension/make/make-3.82.90-cvs-20120823/