Russian Qt Forum
Ноябрь 25, 2024, 21:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Подскажите как написать/подключить библиотеку (dll, so...)  (Прочитано 17719 раз)
Sheridan
Гость
« : Январь 11, 2007, 01:24 »

Перекопал ассистанта, но так ничего и не понял...
Как написать и динамически подключить библиотеку на кутэ? Тоесть и основной модуль на кутэ, и библиотека на кутэ. Чтобы это работало кроссплатформенно...
Лучшим объяснением был бы пример экспорта функции из библиотеки и импорта этой функции в основном модуле.
кутэ 4я
Записан
Dendy
Гость
« Ответ #1 : Январь 11, 2007, 05:34 »

Если динамически загружаемая библиотека использует шаровую Qt - она должна бьІть проверена на совместимость с основньІм модулем. Для етого предусмотрена система плагинов. Достаточно подробньІе обьяснения в Ассистанте (Plugin System, QPluginLoader) и примерах: exmaples/tools/plugandpaint.

Если линковать статически - пользоваться стандартньІми средствами: заголовочники от либьІ + .la (.lib) + .so (.dll).
Записан
Sheridan
Гость
« Ответ #2 : Январь 11, 2007, 18:02 »

Цитата: "Dendy"
Если динамически загружаемая библиотека использует шаровую Qt - она должна бьІть проверена на совместимость с основньІм модулем. Для етого предусмотрена система плагинов. Достаточно подробньІе обьяснения в Ассистанте (Plugin System, QPluginLoader) и примерах: exmaples/tools/plugandpaint.

Смотрел я туда - честно говоря ничего не понял...
Записан
BaltikS
Гость
« Ответ #3 : Январь 11, 2007, 20:05 »

Цитировать

Смотрел я туда - честно говоря ничего не понял...

Ну друг, читай книги, лазий по интернету, познавай мир...

добавлено спустя 2 минуты:

 Кстати в ассистенте то про это есть целая глава How to Create Qt Plugins.
А также книгу по QT4 Бланшета, глава - Making Applictions Plugin-Aware

добавлено спустя 3 минуты:

 Если тебе необходимо статически слинковать DLL, то тебе сюда http://prog.org.ru/forum/topic_3698_0.html
Записан
Sheridan
Гость
« Ответ #4 : Январь 11, 2007, 23:03 »

Цитата: "BaltikS"
Ну друг, читай книги, лазий по интернету, познавай мир...

Пытаюсь...

Цитата: "BaltikS"
Кстати в ассистенте то про это есть целая глава How to Create Qt Plugins.
А также книгу по QT4 Бланшета, глава - Making Applictions Plugin-Aware

А где там про экспорт и импорт функций?

Цитата: "BaltikS"
Если тебе необходимо статически слинковать DLL, то тебе сюда http://prog.org.ru/forum/topic_3698_0.html

Да не нужна мне статика. Мне динамика нужна.

Кода кусочек, в несколько строчек показать можеш? Экспорт и импорт функции. Дальше я уже сам.
Записан
Dendy
Гость
« Ответ #5 : Январь 11, 2007, 23:38 »

Експорт и импорт функции ничем не будет отличаться от експорта и импорта класса интерфейса. Ибо всё равно нужна достоверность версии загружаемой лна лету DLL. Для проверки версии используется система плагинов.

Что нужно:

1. Интерфейс, через которьІй дёргаем функционал библиотеки. Может бьІть несколько на один плагин.
Код:
class MyInterface
{
public:
  virtual ~MyInterface();

  virtual QString doSomething( int value ) = 0;
};
Q_DECLARE_INTERFACE( MyInterface,
  "unique_keyword.MyInterface.version-1.0")


2. Реализация интерфейса (сам плагин). Ето класс, наследуется от QObject и интерфейса/интерфейсов. Может бьІть ровно один в плагине.
Код:
// myplugin.h
class MyPlugin : public QObject, MyInterface
{
  Q_OBJECT
  Q_INTERFACES( MyInterface )
public:
  QString doSomething( int value ) { return QString::number( value ); }
};

Код:
//myplugin.cpp
Q_EXPORT_PLUGIN2( my_plugin, MyPlugin )


3. Загружаем плагин из основной программьІ:
Код:
QPluginLoader loader( "myplugin.dll" );
if ( !loader.load() )
{
  qWarning( "This is not Qt plugin or plugin not match out Qt Libraries" );
  return;
}
MyInterface * i = qobject_cast<MyInterface*>( loader.instance() );
if ( !i )
{
  qWarning( "This is not plugin for interface MyInterface" );
  return;
}
QString text = i->doSomething( 123 ); // text = "123"
Записан
fanat9
Гость
« Ответ #6 : Январь 12, 2007, 01:01 »

Вот пример.

deconvolution.pro
Код:

TEMPLATE = lib
CONFIG += dll release
HEADERS += deconvolution.h
SOURCES += deconvolution.cpp


deconvolution.cpp
Код:

#define DECONV_DLL __declspec(dllexport)
#endif

#include "deconvolution.h"

extern "C" DECONV_DLL void funcDeconv(QVector<CurveData> &curveMatrix)
{
    int size = curveMatrix.size();
}


deconvolution.h
Код:

#ifndef __DECONVOLUTION1_H
#define __DECONVOLUTION1_H

#include <QVector>

typedef QVector<double> CurveData;

#endif


В программе:
Код:

    QLibrary deconvLib("deconvolution");
    typedef double (*deconvFunction)(QVector<CurveData> &curveMatrix);
    deconvFunction funcDeconv = (deconvFunction)  deconvLib.resolve("funcDeconv");
    if (!funcDeconv)
       statusBar()->showMessage(tr("Can't load deconvolution library."), 15000);
    else
       funcDeconv(curveMatrixForDeconv);
Записан
Sheridan
Гость
« Ответ #7 : Январь 12, 2007, 01:56 »

Ребята, спасибо огромное!! Теперь все стало на свои места. Спасибо!
Записан
iRQSX
Гость
« Ответ #8 : Февраль 09, 2010, 00:43 »

Дабы не плодить темы напишу тут. Вобщем тоже делаю плагин но QPluginLoader упорствует, не загружает библиотеку!

Код
C++ (Qt)
class IModule
{
public:
   virtual ~IModule(){}
   virtual QString moduleName()=0;
};
Q_DECLARE_INTERFACE(IModule,"1.0")

Код
C++ (Qt)
class DBEngine: public QObject, public IModule {
   Q_OBJECT
   Q_INTERFACES(IModule)
public:
   DBEngine();
   QString moduleName();
};

Код
C++ (Qt)
int Modules::loadModule(QString fileName)
{
   QPluginLoader loader(fileName);
   QObject *obj = loader.instance();
   if (IModule *interface = qobject_cast<IModule *>(obj) )
   {
#ifdef QT_DEBUG
   qDebug()<<"Module loaded";
#endif
       return 0;
   }
   else
   {
#ifdef QT_DEBUG
   qDebug()<<"Module not loaded";
#endif
       return 1;
   }

Вобщем после QObject *obj = loader.instance(); в obj нет ареса, все по нулям! На всякий случай прикрепил исходник.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #9 : Февраль 09, 2010, 00:59 »

Дабы не плодить темы напишу тут. Вобщем тоже делаю плагин но QPluginLoader упорствует, не загружает библиотеку!
На всякий случай - библиотека и приложение должны быть собраны одним компилятором.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
iRQSX
Гость
« Ответ #10 : Февраль 09, 2010, 01:03 »

Поясню... Делаю в QT Creator под виндой в одним проекте. Комилится все разом, о разных компиляторах речи не может быть!
Не зря же исходники прицепил Подмигивающий
« Последнее редактирование: Февраль 09, 2010, 01:05 от iRQSX » Записан
crackedmind
Гость
« Ответ #11 : Февраль 09, 2010, 04:56 »

1. loader->errorString() что дает?
2. А где же Q_EXPORT_PLUGIN2 Непонимающий
Записан
iRQSX
Гость
« Ответ #12 : Февраль 09, 2010, 13:46 »

Q_EXPORT_PLUGIN2 вроде используется для плагинов к самому QT(типа поддержки разных БД или форматов графики, или написание компонентов для QTDesigner) Поправте если ошибаюсь... И помню что такое уже делал и Q_EXPORT_PLUGIN2 точно не использовал. Программа выглядела вроде в точности как эта и работала!
loader->errorString() "The file 'H:/QProject/bin/plugins/DBEngine.dll' is not a valid Qt plugin." В принципе как я и предпологал... Но почему?
Кстати такой код

Код
C++ (Qt)
class DBEngine: public QObject, public IModule {
   Q_OBJECT
   Q_INTERFACES(IModule)
public:
   DBEngine();
   QString moduleName();
};
Q_EXPORT_PLUGIN2(dbengine, DBEngine)

не компилится

Код:
debug/moc_dbengine.o: In function `qt_plugin_query_verification_data':
H:\QProject\src\DBEngine/../Core/interfaces.h:6: multiple definition of `qt_plugin_query_verification_data'
debug/dbengine.o:H:\QProject\src\DBEngine/dbengine.h:14: first defined here
debug/moc_dbengine.o: In function `qt_plugin_instance':
H:\QProject\src\DBEngine/debug//../dbengine.h:14: multiple definition of `qt_plugin_instance'
debug/dbengine.o:H:\QProject\src\DBEngine/dbengine.h:14: first defined here
collect2: ld returned 1 exit status
mingw32-make[2]: *** [..\..\bin\plugins\DBEngine.dll] Error 1
mingw32-make[1]: *** [debug] Error 2
mingw32-make: *** [sub-DBEngine-make_default] Error 2
Завершено с кодом 2.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #13 : Февраль 10, 2010, 02:06 »

Цитировать
Q_EXPORT_PLUGIN2 вроде используется для плагинов к самому QT
Ошибаетесь для любого плагина надо

все же автору стоит воспользоваться советом и вывести loader.errorString(); все четко будет написано почему не грузится!
Записан
iRQSX
Гость
« Ответ #14 : Февраль 10, 2010, 08:26 »

loader->errorString() "The file 'H:/QProject/bin/plugins/DBEngine.dll' is not a valid Qt plugin." В принципе как я и предпологал...

Все разобрался... Дело действительно было в Q_EXPORT_PLUGIN2 Улыбающийся Просто не там прописывал. Спасибо что навели!
« Последнее редактирование: Февраль 10, 2010, 08:34 от iRQSX » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.123 секунд. Запросов: 23.