Qt subdirs включают классы

Я следую Qt Echo Plugin пример и пытаюсь написать сложное приложение. Мой проект имеет следующую структуру:

MainDir \
Main.pro
kernel \
kernel.pro
abstractinterface.h
main.cpp
testplugin \
testplugin.pro
abstractplugin.h
abstractplugin.cpp

Проблема в заголовочном файле плагина:

#include <QObject>
#include <QtPlugin>
#include "abstractinterface.h"
class AbstractPlugin : public QObject, AbstractInterface
// An error appears here
// expected class-name before '{' token
{
Q_OBJECT
//... plugin initialization code ...
public:
explicit AbstractPlugin(QObject *parent = 0);
};

Также автозаполнению не удается найти класс AbstractInterface.

Итак, вопрос: что я делаю не так? В testplugin.pro файл у меня есть строка INCLUDEPATH += ../kernel/,

Любая помощь приветствуется.

—- РЕДАКТИРОВАТЬ ——
abstractinterface.h

#include <QtPlugin>

#define INTERFACE_ID "AbstractInterface/1.0"
class AbstractInterface
{
public:
virtual ~AbstractInterface();virtual void init();
virtual void enable();
virtual void disable();
};

Q_DECLARE_INTERFACE(AbstractInterface, INTERFACE_ID)

1

Решение

Учитывая, что ваши вставленные файлы выглядят корректно и работают здесь, я склоняюсь к тому, что ваша проблема заключается в следующей строке:

INCLUDEPATH += ../kernel/

Скорее всего, вы выполняете qmake из корня проекта, в котором находится ваш основной файл проекта, и рекурсивно вызываете qmake для генерации Make-файлов. Однако в момент создания вышеупомянутый путь будет простираться от корня проекта, а не от подкаталога. Пожалуйста исправьте testplugin.pro файл проекта, используя вместо этого:

INCLUDEPATH += $$PWD/../kernel/

Тем не менее, что еще лучше дизайн, это не обрабатывать его внутри этого файла проекта, а другой kernel.pro где находятся файлы заголовков. Это более гибкий дизайн, чтобы добавить это там:

INCLUDEPATH += $$PWD

Изменить: на основе вашего комментария, который не был в исходном вопросе, кажется, что у вас есть другая проблема. Похоже, вы перепутали охрану включений, называемую одинаково в двух разных файлах, и поэтому второе включение не привело к предоставлению вам доступа.

2

Другие решения


По вопросам рекламы [email protected]