迁移到Qt5时,无法在子目录中定位头文件

Unable to locate the header files inside subdirectories while migrating to Qt5

本文关键字:子目录 定位 文件 Qt5 迁移      更新时间:2023-10-16

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

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

现在我被一个问题困住了,我一直得到编译错误:

致命错误C1083: Cannot open include file

从子目录中的头文件中取出,例如,#include "FooFolder/bar.h"。编译器无法找到所有这些头文件,我完全困惑了,因为:

  1. 智能感应工作良好。
  2. 如果我改回旧的工具包Qt 4.8.5,它编译良好
  3. 两个套件使用相同的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

这些似乎是不正确的:

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

1) 意味着它连接下一行,这不是你想要的。对于后面跟着空行的行来说,这不是问题,但是对于这里的INCLUDEPATH来说,这不是很好,如果你用一些包含来替换空行,你也可能会遇到其他行的问题。

2)您还需要将$$PWD放入includepath以获得项目根目录"注册",因为您的包含应该从那里开始,而不是源代码的当前工作目录,因为您可以假设这不是正确的路由。

因此,你可以这样写:

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