сразу прошу простить за весьма ламерский вопрос, на QT пробую кодить второй день, и все два дня посвятил созданию простого примера с динамическими библиотеками.
Пытаюсь повторить этот пример, но он то не компилируется, то загрузка плагина не происходит
Вообщем мой вопрос в том, почему так, что неправильно,
и еще я буду безумно благодарен, если кто-то выложит не отдельно файлики проекта, а весь проект с любым плагином целиком
Собираю в Qt Creator 1.3.0 (Qt 4.6.0) (32-х битной) Windows7
Мой проект выглядит как-то так:
файл plugin/interface.h
#ifndef INTERFACE_H
#define INTERFACE_H
#include <QString>
class Base
{
public:
virtual QString echo();
};
Q_DECLARE_INTERFACE(Base,"com.trolltech.Plugin.Base/1.0");
#endif
Кусок файла plugin/mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QDir pluginsDir(qApp->applicationDirPath());
Base *interface;
pluginsDir.cd("plugins");
foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
if (pluginLoader.isLoaded())
QMessageBox::information(this,"caption","yes");
else
QMessageBox::information(this,"caption","no");
QObject *plugin = pluginLoader.instance();
if (plugin) {
interface = qobject_cast<Base *>(plugin);
}
}
}
Файл plugin/plugin.pro
TARGET = plugin
TEMPLATE = app
SOURCES += main.cpp \
mainwindow.cpp
HEADERS += mainwindow.h \
interface.h
FORMS += mainwindow.ui
Файл plugin/dynamic2/dynamic2.h
#ifndef DYNAMIC_H
#define DYNAMIC_H
#include <QObject>
#include "dynamic2.h"
#include "../interface.h"
class Q_DECL_EXPORT Plugin : public QObject, Base
{
Q_OBJECT
Q_INTERFACES(Base)
public:
QString echo();
};
#endif // DYNAMIC_H
Файл plugin/dynamic2/dynamic2.cpp
#include <QtGui>
#include "dynamic2.h"
QString Plugin::echo()
{
return "some string";
}
Q_EXPORT_PLUGIN2(myplugin, Plugin);
Файл plugin/dynamic2/dynamic2.pro
TARGET = $$qtLibraryTarget(myplugin)
TEMPLATE = lib
DEFINES += DYNAMIC2_LIBRARY
SOURCES += dynamic2.cpp
HEADERS += dynamic2.h\
dynamic2_global.h
CONFIG += shared
При этом проект dynamic2 не компилируется с ошибкой
D:\Tools\QT\plugin\dynamic2/../interface.h:7: undefined reference to `vtable for Base'
:-1: error: collect2: ld returned 1 exit status
Но, если в dynamic.pro выставить CONFIG += release, то dll компилируется
Но, даже если проект plugin собрать в режиме релиза, и положить получившуюся dll в нужную папку (пути верны, я проверял), то все равно приложение при запуске покажет сообщение "no" - плагин не загружен
Весь проект лежит здесь
Еще раз скажу, что буду безумно благодарен скомпонованному проекту с любым плагином.
С уважением, Дмитрий