crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 5.7.2025, 5:35