迁移到 Qt5 时无法在子目录中找到头文件

Posted

技术标签:

【中文标题】迁移到 Qt5 时无法在子目录中找到头文件【英文标题】:Unable to locate the header files inside subdirectories while migrating to Qt5 【发布时间】:2014-05-26 08:41:23 【问题描述】:

我最近一直在从 Qt 4.8.5 迁移到 Qt 5.3.0,这些是相关信息:

Windows 7 32 位 Qt 3.1.1 MSVC 2010编译器(我的两个Qt版本都是MSVC2010版的预编译包) 来自 Win7 SDK 的调试器

现在我被一个问题困住了,我不断收到编译错误:

致命错误 C1083:无法打开包含文件

来自子目录中的那些头文件,例如,#include "FooFolder/bar.h"。 编译器无法找到所有此类标头,我完全糊涂了,因为:

    Intellisense 运行良好。 如果我改回旧套件 Qt 4.8.5,它可以正常编译 两个套件都使用相同的 MSVC 编译器。

这是我的.pro 文件:

QT += core gui script
QT += printsupport

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = MyApp
TEMPLATE = app

SOURCES += main.cpp\
        mainwindow.cpp \
    qcustomplot.cpp \
    dialogs/filterdialog.cpp \
    databox/databox.cpp \
    databox/datom.cpp \
    #... and more FooFolder/bar.cpp

HEADERS  += mainwindow.h \
    qcustomplot.h \
    dialogs/filterdialog.h \
    databox/databox.h \
    databox/datom.h \
    #... and more FooFolder/bar.h        

RESOURCES += \
    resources.qrc

win32: LIBS += -LC:/ADLINK/UDASK/lib/ -lusb-dask \    
INCLUDEPATH += C:/ADLINK/UDASK/include \
DEPENDPATH += C:/ADLINK/UDASK/include \

include(qext/qextserialport.pri)

这是.h 文件之一,该文件包含其他子目录标题

#ifndef SETWINDOW_H
#define SETWINDOW_H
#include <QObject>
#include "databox/databox.h" // <---fatal error C1083: Cannot open include file 

class SetWindow: public QObject

    Q_OBJECT

public:
    SetWindow();

public Q_SLOTS:
    void setPointNum(int n);
    void setStepSize(int s);    
    int getPointNum();
    int getStepSize();
    void requestSignal();

Q_SIGNALS:
    void sendParameters(int p, int s);

private:
    QString DynamicString;
    DataBox *presentData;

    int m_PointNum;
    int m_StepSize;
;

#endif // SETWINDOW_H

并且头文件被包含失败:

#ifndef DATABOX_H
#define DATABOX_H
#include <QVector>
#include <QFile>
#include <QMap>
#include <QString>
#include "datom.h"

class Measurement

public:
    Measurement();
    void setNumChan(int n);
    void setADRange(QString &s);
    void setSamplingRate(int n);
    void setTimeBase(double d);

    int NumChan;
    QString ADRange;
    int SamplingRate;
    double TimeBase;
;

class DataBox
    
public:
    DataBox();

    void setCurrentFile(QString path);
    void loadData();
    void cleanAll();    

    QVector<double>* py_0;    
    QVector<double>* py_1;
    QVector<double>* ptimeStamp;
    QVector<double>* pi_M;
    QVector<double>* py_M;
    QVector<double>* py_W;

    QMap<double, double> AI_0;
    QMap<double, double> AI_1;
    QMap<int, double> AI0;
    QMap<int, double> AI1;

    double timeBase;

    Measurement parameters;
    QVector<Datom> *dataPoints;

private:
    QString currentFile;
;

#endif // DATABOX_H

【问题讨论】:

向我们展示代码!此外,您遗漏了错误消息中最重要的部分,即实际未找到的后续部分。 @LaszloPapp 什么样的代码? .pro 文件? 以及发生错误的源文件。另外,不要截断错误消息。照原样粘贴。 ;) 顺便说一句,#include FooFolder/bar.h 在语法上是错误的。您需要"..."&lt;...&gt;。另外,以后尽量从qextserialport迁移到qtserialport。 :) @LaszloPapp 哎呀,那个语法错误是我的错字,sry。 【参考方案1】:

这些似乎不正确:

win32: LIBS += -LC:/ADLINK/UDASK/lib/ -lusb-dask \

INCLUDEPATH += C:/ADLINK/UDASK/include \
DEPENDPATH += C:/ADLINK/UDASK/include \

1) \ 表示它加入了下一行,这不是您想要的。对于后面有空行的行来说这不是问题,但对于这里的INCLUDEPATH 来说并不好,如果你用一些包含替换空行,你也可能会遇到其他行的问题。

2) 您还需要将$$PWD 放入包含路径中以“注册”项目根目录,因为您的包含应该从那里开始,而不是源的当前工作目录,因为这不是您的正确路线可以假设。

因此,你会这样写:

win32: LIBS += -LC:/ADLINK/UDASK/lib/ -lusb-dask

INCLUDEPATH += $$PWD C:/ADLINK/UDASK/include
DEPENDPATH += C:/ADLINK/UDASK/include

【讨论】:

虽然这不是错误的来源,但谢谢你,那些 \ 是那些已被删除的连接路径的剩余部分,我会在未来记住这一点。 这是错误的来源。您尚未添加$$PWD。您如何期望从那里工作的相对路径? 我做了,但没有任何区别...... : ( 你需要重新运行qmake。 @Tay2510:我想在 qmake 中进行了一些清理,默认情况下不包括当前工作目录,因为大多数时候不需要它。

以上是关于迁移到 Qt5 时无法在子目录中找到头文件的主要内容,如果未能解决你的问题,请参考以下文章

如何解决操作系统中丢失Qt5core.dll文件

qt 无法打开stddef.h,最终解决方案

在 OS X 的 Qt5.5 中找不到 qmake

SecureCRT 迁移到新环境,导出配置文件目录 转

CMake Qt5无法为ui文件AUTOUIC生成头文件

PDOException SQLSTATE[HY000] [2002] 尝试迁移时没有这样的文件或目录