Я следую 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)
Учитывая, что ваши вставленные файлы выглядят корректно и работают здесь, я склоняюсь к тому, что ваша проблема заключается в следующей строке:
INCLUDEPATH += ../kernel/
Скорее всего, вы выполняете qmake из корня проекта, в котором находится ваш основной файл проекта, и рекурсивно вызываете qmake для генерации Make-файлов. Однако в момент создания вышеупомянутый путь будет простираться от корня проекта, а не от подкаталога. Пожалуйста исправьте testplugin.pro
файл проекта, используя вместо этого:
INCLUDEPATH += $$PWD/../kernel/
Тем не менее, что еще лучше дизайн, это не обрабатывать его внутри этого файла проекта, а другой kernel.pro
где находятся файлы заголовков. Это более гибкий дизайн, чтобы добавить это там:
INCLUDEPATH += $$PWD
Изменить: на основе вашего комментария, который не был в исходном вопросе, кажется, что у вас есть другая проблема. Похоже, вы перепутали охрану включений, называемую одинаково в двух разных файлах, и поэтому второе включение не привело к предоставлению вам доступа.