Search code examples
c++visual-studio-2010qtqt-creatorqmake

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


I have been migrating from Qt 4.8.5 to Qt 5.3.0 recently, and these are the related information:

  • Windows 7 32 bit
  • Qt 3.1.1
  • MSVC 2010 compiler (Both my Qt versions are pre-compiled package of MSVC2010 edition)
  • debugger from Win7 SDK

Now I've been trapped by a problem that I keep getting compilation errors:

fatal error C1083: Cannot open include file

from those header files inside subdirectories, for example, #include "FooFolder/bar.h". The compiler is unable to locate all this kind of headers and I am totally befuddled since:

  1. The Intellisense works well.
  2. If I change back to old kit Qt 4.8.5, it compiles fine
  3. Both kits use the same MSVC compiler.

Here is my .pro file:

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)

and here is one of the .h file that files to include other subdirectoried headers

#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

and the header file failed to be included:

#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

Solution

  • These seem to be incorrect:

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

    1) \ means it joins the next line which is not what you wish. It is not an issue for the lines with followed empty line, but it is not good for the INCLUDEPATH in here, and if you replace the empty lines with some containment, you could run into issues with the other lines, too.

    2) You will also need to put $$PWD into the includepath to get the project root "registered" since your include should start from there, not the current working directory of the source since that is not the right route as you can assume.

    Therefore, you would be writing something like this:

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