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

Popular posts from this blog

mysql - Dreamhost PyCharm Django Python 3 Launching a Site -

java - Sending SMS with SMSLib and Web Services -

java - How to resolve The method toString() in the type Object is not applicable for the arguments (InputStream) -