Russian Qt Forum

Qt => Общие вопросы => Тема начата: Sheridan от Январь 11, 2007, 01:24



Название: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: Sheridan от Январь 11, 2007, 01:24
Перекопал ассистанта, но так ничего и не понял...
Как написать и динамически подключить библиотеку на кутэ? Тоесть и основной модуль на кутэ, и библиотека на кутэ. Чтобы это работало кроссплатформенно...
Лучшим объяснением был бы пример экспорта функции из библиотеки и импорта этой функции в основном модуле.
кутэ 4я


Название: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: Dendy от Январь 11, 2007, 05:34
Если динамически загружаемая библиотека использует шаровую Qt - она должна бьІть проверена на совместимость с основньІм модулем. Для етого предусмотрена система плагинов. Достаточно подробньІе обьяснения в Ассистанте (Plugin System, QPluginLoader) и примерах: exmaples/tools/plugandpaint.

Если линковать статически - пользоваться стандартньІми средствами: заголовочники от либьІ + .la (.lib) + .so (.dll).


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

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


Название: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: BaltikS от Январь 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


Название: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: Sheridan от Январь 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

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

Кода кусочек, в несколько строчек показать можеш? Экспорт и импорт функции. Дальше я уже сам.


Название: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: Dendy от Январь 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"


Название: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: fanat9 от Январь 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);


Название: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: Sheridan от Январь 12, 2007, 01:56
Ребята, спасибо огромное!! Теперь все стало на свои места. Спасибо!


Название: Re: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: iRQSX от Февраль 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 нет ареса, все по нулям! На всякий случай прикрепил исходник.


Название: Re: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: panAlexey от Февраль 09, 2010, 00:59
Дабы не плодить темы напишу тут. Вобщем тоже делаю плагин но QPluginLoader упорствует, не загружает библиотеку!
На всякий случай - библиотека и приложение должны быть собраны одним компилятором.


Название: Re: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: iRQSX от Февраль 09, 2010, 01:03
Поясню... Делаю в QT Creator под виндой в одним проекте. Комилится все разом, о разных компиляторах речи не может быть!
Не зря же исходники прицепил ;)


Название: Re: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: crackedmind от Февраль 09, 2010, 04:56
1. loader->errorString() что дает?
2. А где же Q_EXPORT_PLUGIN2 ???


Название: Re: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: iRQSX от Февраль 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.


Название: Re: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: break от Февраль 10, 2010, 02:06
Цитировать
Q_EXPORT_PLUGIN2 вроде используется для плагинов к самому QT
Ошибаетесь для любого плагина надо

все же автору стоит воспользоваться советом и вывести loader.errorString(); все четко будет написано почему не грузится!


Название: Re: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: iRQSX от Февраль 10, 2010, 08:26
loader->errorString() "The file 'H:/QProject/bin/plugins/DBEngine.dll' is not a valid Qt plugin." В принципе как я и предпологал...

Все разобрался... Дело действительно было в Q_EXPORT_PLUGIN2 :) Просто не там прописывал. Спасибо что навели!


Название: Re: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: BRE от Февраль 10, 2010, 08:35
А ты Q_EXPORT_PLUGIN2(dbengine, DBEngine) не в .h файле напиши, а в .cpp


Название: Re: Подскажите как написать/подключить библиотеку (dll, so...)
Отправлено: iRQSX от Февраль 10, 2010, 08:37
Еще раз спасибо за подсказки! Посмотрел внимательно Plug&Paint и там увидил что в cpp надо прописывать.