Предварительно собранные заголовки не работают в отладочной сборке с Qt Creator / qmake / MinGw

В Qt Creator у меня есть pro-файл с использованием PRECOMPILED HEADERS.

Сборка работает просто отлично, когда я работаю в режиме Release. Но сборка в режиме отладки приводит к ошибкам, генерированию объектных файлов не удается. Пример:

17:12:40: Running steps for project Euclide...
17:12:40: Configuration unchanged, skipping qmake step.
17:12:40: Starting: "C:\Qt\Tools\mingw48_32\bin\mingw32-make.exe"C:\Qt\5.2.0\mingw48_32\bin\qmake.exe -spec win32-g++ CONFIG+=debug -o Makefile ..\euclide\Euclide.pro
C:/Qt/Tools/mingw48_32/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory 'C:/UserPrograms/Euclide/build'
g++ -c -include debug\_pch.h -pipe -fno-keep-inline-dllexport -std=gnu++11 -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_WEBKITWIDGETS_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_QUICK_LIB -DQT_POSITIONING_LIB -DQT_OPENGL_LIB -DQT_PRINTSUPPORT_LIB -DQT_WEBKIT_LIB -DQT_MULTIMEDIA_LIB -DQT_QML_LIB -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_SENSORS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I..\euclide -I"..\..\..\Program Files (x86)\boost\boost_1_53_0" -I"..\numlib\mathvec" -I"..\..\..\Qt\5.2.0\mingw48_32\include" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtWebKitWidgets" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtMultimediaWidgets" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtQuick" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtPositioning" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtOpenGL" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtPrintSupport" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtWebKit" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtMultimedia" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtQml" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtWidgets" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtNetwork" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtSensors" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtGui" -I"..\..\..\Qt\5.2.0\mingw48_32\include\QtCore" -I"debug" -I"." -I"." -I"..\..\..\Qt\5.2.0\mingw48_32\mkspecs\win32-g++" -o debug\main.o ..\euclide\main.cpp

Makefile.Debug:1543: recipe for target 'debug/main.o' failed
mingw32-make[1]: *** [debug/main.o] Error 1
mingw32-make[1]: Leaving directory 'C:/UserPrograms/Euclide/build'
makefile:34: recipe for target 'debug' failed
mingw32-make: *** [debug] Error 2
17:12:59: The process "C:\Qt\Tools\mingw48_32\bin\mingw32-make.exe" exited with code 2.
Error while building/deploying project Euclide (kit: Desktop Qt 5.2.0 MinGW 32bit)
When executing step 'Make'
17:12:59: Elapsed time: 00:19.

Что действительно сбивает с толку, так это то, что он отлично работает в Release. Я провел несколько тестов с небольшим проектом, и он отлично работает в режимах выпуска или отладки, но по любой причине крупный проект терпит неудачу. Даже невозможно откомпилировать один файл проекта в Debug.
Про файл ниже:

QT += core gui \
webkitwidgets \
printsupport

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Euclide
TEMPLATE = app

QMAKE_CXXFLAGS += -std=gnu++11

CONFIG += precompile_header

# Use Precompiled headers (PCH)
PRECOMPILED_HEADER  = _pch.h

SOURCES +=  main.cpp\
mainwindow.cpp \
zero.cpp \
... lot of files here...
debug_tool.cpp

HEADERS += mainwindow.h \
zero.h \
... lot of files here...
debug_tool.h \
_pch.h

FORMS += mainwindow.ui \
zero.ui \
... other files...
apphelp.ui \
message.ui

INCLUDEPATH = "C:/Program Files (x86)/boost/boost_1_53_0"
LIBS += \
../build/release/exprcompiler.dll

RESOURCES += \
resources/euclide_resources.qrc

Я провел много дней в сети, чтобы решить эту проблему, но не нашел никакого объяснения, даже если документация о qmake завершена …

Кто-нибудь знает, как решить эту проблему? потому что единственное решение, которое я рассматриваю сейчас, — это иметь специальную «отладочную» версию всего этого проекта, без предварительно скомпилированных заголовков …
Спасибо за вашу помощь.

3

Решение

Я (вероятно) столкнулся с той же проблемой и занял некоторое время, чтобы выяснить, что происходит.

После некоторого возни с созданием MWE я обнаружил, что размер файла .pch, кажется, имеет решающее значение для этой проблемы.

Использование PCH размером более 128 МБ прерывает компиляцию без каких-либо сообщений и возвращает код 1 (вместо 0 для успешной компиляции).

Мои выводы напоминают проблему, изложенную в этом Запись в списке рассылки GCC.

Кажется, единственный способ заставить это работать уменьшить размер файла PCH ниже 128 МБ.

Только для записи:
Я использую проект QMake из Qt 5.2.1 и включенный MinGW (rev2) gcc 4.8.0 32bit на WinXP 32bit и Win 8 64bit.

С другой стороны, мой 64-битный GCC 4.8.2 под linux съел ~ 5 ГБ PCH-файл без нареканий (я бы протестировал больший, но компиляция этого почти превысила мою оперативную память).

Копать глубже

Я сгенерировал заголовочный файл для использования в качестве PCH со следующим содержимым:

class _1 {};
class _2 {};
class _3 {};
class _4 {};
class _5 {};
class _6 {};
class _7 {};
class _8 {};
class _9 {};
class _10 {};
//...

Используя бинарный поиск (по количеству классов в этом файле), я обнаружил, что
заполнение этого файла 128273 классами приводит к созданию сгенерированного файла PCH, который имеет размер 135266564 байта и может использоваться во время компиляции других файлов.
При использовании классов 128274 сгенерированный файл PCH имеет размер 135270660 байт, и компиляция с использованием этого PCH завершается неудачно.

Я не уверен, что делать с этой информацией. Не выдавать сообщение об ошибке, безусловно, неправильно, но я не знаю, кто виноват (GCC (версия?), MinGW / Windows, 32-разрядность).

Может быть, кто-то с большим количеством времени может решить и сообщить нужным людям?

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector