crossplatform.ru

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


  Ответ в Динамические библиотеки QT
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 26.1.2010, 7:05
 
Цитата(theravel @ 26.1.2010, 1:02) *
что значит этот ноль?
Цитата(BRE @ 26.1.2010, 1:22) *
Определение чисто виртуальной функции (pure virtual).
Добавлю:
класс который содержит истинно-виртуальную функцию обычно называют - абстрактным, т.к. нельзя создать экземпляр такого класса (истинно-виртуальная функция не имеет реализации). Абстрактные классы предназначены только для наследования.
BRE Дата 25.1.2010, 22:22
 
Цитата(theravel @ 25.1.2010, 22:02) *
что значит этот ноль? где можно почитать про такие конструкции?

Определение чисто виртуальной функции (pure virtual).
Почитать можно в книгах по C++.
theravel Дата 25.1.2010, 22:02
  Тогда еще один вопрос, просто из любопыства,

class Base
{
public:
    virtual QString echo() = 0;
};


что значит этот ноль? где можно почитать про такие конструкции?
theravel Дата 24.1.2010, 22:28
 
Цитата(BRE @ 24.1.2010, 17:59) *
Ну значит все нормально:


Заработало, действительно)) спасибо!
BRE Дата 24.1.2010, 17:59
 
Цитата(theravel @ 24.1.2010, 17:00) *
сделал, но при запуске приложения библиотека не загружается, а QPluginLoader::errorString() выдает "unknown error"

Ну значит все нормально:
ainWindow::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));
         QObject *plugin = pluginLoader.instance();
         if (plugin) {
             interface = qobject_cast<Base *>(plugin);
             if( interface )
                 QMessageBox::information(this,"caption", interface->echo() );
         }
    }
}
ViGOur Дата 24.1.2010, 17:34
  Для вывода отладочной информации плагинов можно использовать QT_DEBUG_PLUGINS=1.
Тебе нужно установить этот параметр в настройках Qt Creator'a, правда не знаю где, так как нет его под рукой...
theravel Дата 24.1.2010, 17:00
  Так, если по порядку,

Добавил это
class Base
{
public:
    virtual QString echo() = 0;
};

теперь библиотека компилируется без ошибок, отлично =)

Цитата
В pro файлы проектов добавь:
CONFIG += release

Сделай в обоих проектах
make distclean
qmake
make

сделал, но при запуске приложения библиотека не загружается, а QPluginLoader::errorString() выдает "unknown error"
BRE Дата 24.1.2010, 15:56
  У QPluginLoader есть метод:
QString QPluginLoader::errorString () const

Собирай и плагин и программу в чем то одном, или debug или release.
В pro файлы проектов добавь:
CONFIG += release

Сделай в обоих проектах
make distclean
qmake
make

и все заработает. :)

Еще я бы добавил:
class Base
{
public:
    virtual QString echo() = 0;
};
theravel Дата 24.1.2010, 15:24
  День добрый,
сразу прошу простить за весьма ламерский вопрос, на 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" - плагин не загружен

Весь проект лежит здесь
Еще раз скажу, что буду безумно благодарен скомпонованному проекту с любым плагином.
С уважением, Дмитрий
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 16:52