PRECOMPILED HEADERS无法使用Qt Creator/qmake/MinGw进行调试构建

 时尚妈咪达人都_354 发布于 2023-02-05 08:07

在Qt Creator中,我有一个使用PRECOMPILED HEADERS的专业文件.

当我在Release模式下构建时,构建工作非常完美.但是在Debug模式下构建会产生错误,导致生成目标文件失败.例:

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中运行良好.我用一个小项目做了一些测试,它在Release或Debug模式下运行良好,但由于任何原因,一个更大的项目失败了.甚至不可能在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的文档已经完成......

有谁知道如何解决这个问题?因为我现在考虑的唯一解决方案是拥有这个所有项目的特殊"调试"版本,没有预编译头...感谢您的帮助.

1 个回答
  • 我(可能)遇到了同样的问题,并花了一些时间来了解发生了什么.

    经过一番摆弄来创建一个我发现的MWE后,.pch文件的大小似乎对这个问题至关重要.

    使用大于128 MB的PCH将在没有任何消息的情况下中止编译并返回代码1(而不是0以进行成功编译).

    我的发现类似于GCC邮件列表条目中提到的问题.

    似乎让它工作的唯一方法是将PCH文件的大小减小到128 MB以下.

    仅供记录:我正在使用Qt 5.2.1中的QMake项目和WinXP 32位和Win 8 64位上包含的MinGW(rev2)gcc 4.8.0 32位.

    另一方面,我在Linux下的GCC 4.8.2 64bit吃了一个~5GB的PCH文件,没有任何抱怨(我会测试一个更大的,但编译这个几乎超过我的RAM).

    深层发掘

    我生成了一个头文件用作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位).

    也许有更多时间的人可以决定并告知合适的人?

    2023-02-05 08:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有