crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Динамические библиотеки QT
theravel
  опции профиля:
сообщение 24.1.2010, 15:24
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 24.1.2010
Пользователь №: 1400

Спасибо сказали: 0 раз(а)




Репутация:   0  


День добрый,
сразу прошу простить за весьма ламерский вопрос, на 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" - плагин не загружен

Весь проект лежит здесь
Еще раз скажу, что буду безумно благодарен скомпонованному проекту с любым плагином.
С уважением, Дмитрий
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 14.1.2025, 20:59