Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Григорий от Июнь 13, 2015, 16:46



Название: вызов функции класса из другого плагина
Отправлено: Григорий от Июнь 13, 2015, 16:46
 Уважаемые форумчане не могу разобраться вот с такой проблемой, подскажите что не так...

Набросал тестовое приложение следующей архитектуры
 1) базовый бинарник  просто загружает в память все плагины из указанной директории и запускает функцию init у обоих плагинов
 2) 2 плагина (cначала грузится core потом plugin1)

при попытке вызвать в функции init второго плагина функцию класса первого плагина получаю ошибку
 
Код:
libplugin1.so: undefined symbol: _ZN5ICore10mainWindowEv

вот пример обоих плагинов
Код:
TEMPLATE = lib
CONFIG += plugin
QT += widgets

HEADERS  += core.h \
    icore.h

SOURCES += core.cpp \
    icore.cpp

OTHER_FILES += core.json
Код:
#ifndef CORE_H
#define CORE_H

#include <QObject>
#include "../plugin.h"

class Core : public QObject, Plugin {
    Q_OBJECT
    Q_PLUGIN_METADATA(IID Plugin_iid FILE "core.json")
    Q_INTERFACES(Plugin)

    void init();
};

#endif // CORE_H
Код:
#ifndef ICORE_H
#define ICORE_H

#include <QMainWindow>

class Q_DECL_EXPORT ICore :public QObject {
    Q_OBJECT
public:
    explicit ICore(QMainWindow *mw);
    static QMainWindow *mainWindow();
};

#endif // ICORE_H
Код:
#include "QMainWindow"
#include "icore.h"
#include "core.h"

void Core::init() {
    QMainWindow *mainwindow = new QMainWindow;
    new ICore(mainwindow);
    mainwindow->show();
}
Код:
#include "icore.h"

static QMainWindow *mainwindow;

ICore::ICore(QMainWindow *mw) {
    mainwindow = mw;
}

QMainWindow* ICore::mainWindow() {
    return mainwindow;
}
Код:
TEMPLATE = lib
CONFIG += plugin
QT += widgets

HEADERS  += plugin.h

SOURCES += plugin.cpp

OTHER_FILES += plugin.json
Код:
#ifndef PLUGIN1_H
#define PLUGIN1_H

#include <QObject>
#include "../plugin.h"

class Plugin1 : public QObject, Plugin {
    Q_OBJECT
    Q_PLUGIN_METADATA(IID Plugin_iid FILE "plugin1.json")
    Q_INTERFACES(Plugin)

    void init();
};

#endif // PLUGIN1_H
Код:
#include <QDebug>
#include "../core/icore.h"
#include "plugin1.h"

void Plugin1::init() {
    qDebug() << "init Plugin1";
    qDebug() << ICore::mainWindow();
}


Название: Re: вызов функции класса из другого плагина
Отправлено: AlFoX от Июнь 14, 2015, 04:39
Попробуйте убрать Q_DECL_EXPORT


Название: Re: вызов функции класса из другого плагина
Отправлено: Fregloin от Июнь 15, 2015, 21:32
а где код класса Plugin?