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

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

Другие вопросы по тегам