c++ - Qt plugin using host app's classes -
i have linking problems creating qt c++ plugin extend functionality of application. code compiles , everithing works, long use qt library classes, qstring example. moment give plugin's class reference object classes defined in host app, project not linked anymore. creating plugin follow procedure qt documentation , take consideration given examples - echo , plug&paint. however, such case not covered there.
update
here error:
myplugin.obj:-1: error: lnk2019: unresolved external symbol "public: class qstring __cdecl myclass::answer(void)const " (?answer@myclass@@qeba?avqstring@@xz) referenced in function "public: virtual class qstring __cdecl myplugin::echo(class myclass *)" (?echo@myplugin@@ueaa?avqstring@@peavmyclass@@@z)
and here project causes it:
plugtest.pro
template = subdirs subdirs += \ host \ plugin
host.pro
qt += core gui greaterthan(qt_major_version, 4): qt += widgets target = host template = app sources += main.cpp\ mainwindow.cpp \ myclass.cpp headers += mainwindow.h \ myclass.h \ pluginterface.h forms += mainwindow.ui
mainwindow.h
#ifndef mainwindow_h #define mainwindow_h #include <qmainwindow> #include <qmessagebox> #include <qpluginloader> #include <qdir> #include "myclass.h" #include "pluginterface.h" namespace ui { class mainwindow; } class mainwindow : public qmainwindow { q_object public: explicit mainwindow(qwidget *parent = 0); ~mainwindow(); private slots: void on_button_clicked(); private: bool loadplugin(); ui::mainwindow *ui; pluginterface *m_interface; myclass *m_class; }; #endif // mainwindow_h
myclass.h
#ifndef myclass_h #define myclass_h #include <qobject> class myclass : public qobject { q_object public: explicit myclass(qobject *parent = 0); qstring answer() const; void setanswer(const qstring &str); private: qstring m_answer; }; #endif // myclass_h
pluginterface.h
#ifndef pluginterface_h #define pluginterface_h #include <qstring> #include "myclass.h" class pluginterface { public: virtual ~pluginterface() {} virtual qstring echo(myclass *value) = 0; }; #define pluginterface_iid "example.suite.app.plugininterface" q_declare_interface(pluginterface, pluginterface_iid) #endif // pluginterface_h
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" mainwindow::mainwindow(qwidget *parent) : qmainwindow(parent), ui(new ui::mainwindow) { ui->setupui(this); if (!loadplugin()) { qmessagebox::information(this, "error", "could not load plugin"); } m_class = new myclass(this); m_class->setanswer("good!"); } mainwindow::~mainwindow() { delete ui; } bool mainwindow::loadplugin() { qdir pluginsdir(qapp->applicationdirpath()); if (pluginsdir.dirname().tolower() == "debug" || pluginsdir.dirname().tolower() == "release") pluginsdir.cd("plugins"); foreach (qstring filename, pluginsdir.entrylist(qdir::files)) { qpluginloader pluginloader(pluginsdir.absolutefilepath(filename)); qobject *plugin = pluginloader.instance(); if (plugin) { m_interface = qobject_cast<pluginterface *>(plugin); if (m_interface) return true; } } return false; } void mainwindow::on_button_clicked() { ui->lineresult->settext(m_interface->echo(m_class)); }
myclass.cpp
#include "myclass.h" myclass::myclass(qobject *parent) : qobject(parent) { } qstring myclass::answer() const { return m_answer; } void myclass::setanswer(const qstring &str) { m_answer = str; }
plugin.pro
template = lib config += plugin qt += widgets includepath += ../host headers = myplugin.h sources = myplugin.cpp target = $$qtlibrarytarget(myplugin) destdir = ../plugins
myplugin.h
#ifndef myplugin_h #define myplugin_h #include <qobject> #include "pluginterface.h" class myplugin : public qobject, pluginterface { q_object q_plugin_metadata(iid "example.suite.app.plugininterface") q_interfaces(pluginterface) public: qstring echo(myclass *value) q_decl_override; }; #endif // myplugin_h
myplugin.cpp
include "myplugin.h"
qstring myplugin::echo(myclass *value) { return value->answer(); }
the solution worked me make myclass part of library , include dynamically in both plug-in , host. however, curious if done without creating library.
Comments
Post a Comment