迁移到 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
在语法上是错误的。您需要"..."
或<...>
。另外,以后尽量从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 时无法在子目录中找到头文件的主要内容,如果未能解决你的问题,请参考以下文章