Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: izoomer от Май 21, 2008, 17:36



Название: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: izoomer от Май 21, 2008, 17:36
Решил кое какие вещи в проекте перевести на плагины со статической линковкой и сразу уперся. Все сделал как в plugendpaint а он ругается. Для эксперимента все пустое.
Вот сам плагин :

JMediaPlayerPlugin.h

Код:
#ifndef JMEDIAPLAYERPLUGIN_H
#define JMEDIAPLAYERPLUGIN_H

#include <QObject>
#include <JMediaPlayer.h>

class JMediaPlayerPlugin : public QObject, public JMediaPlayer
{
Q_OBJECT
Q_INTERFACES(JMediaPlayer)

public:
    ~JMediaPlayerPlugin();

};

#endif


JMediaPlayerPlugin.cpp

Код:
#include <QtGui>
#include "JMediaPlayerPlugin.h"


JMediaPlayerPlugin::~JMediaPlayerPlugin()
{
}
Q_EXPORT_PLUGIN2(jmediaplayer, JMediaPlayerPlugin);

JMediaPlayer.h

Код:
#ifndef JMEDIAPLAYER_H
#define JMEDIAPLAYER_H

#include <QString>

class JMediaPlayer
{
public:
// JMediaPlayer() {};
virtual ~JMediaPlayer() {};
};
QT_BEGIN_NAMESPACE
Q_DECLARE_INTERFACE(JMediaPlayer,"myplugins.JMediaPlayer/1.0");
QT_END_NAMESPACE

#endif

.pro

Код:
TEMPLATE        = lib
CONFIG           += plugin static
HEADERS          = JMediaPlayerPlugin.h
SOURCES          = JMediaPlayerPlugin.cpp
TARGET            = $$qtLibraryTarget(jmediaplayer)

в главном проекте в main.cpp

Код:

#include "../libjplayer/JMediaPlayerPlugin/src/JMediaPlayer.h"
#include <QtPlugin>

Q_IMPORT_PLUGIN(jmediaplayer);

int main(int argc, char *argv[])
{
 ....
....
.....


в .pro файл проекта добавил строку

LIBS += -L../libjplayer/JMediaPlayerPlugins/src -ljmediaplayer

.

а он при компиляции ругается ...
Код:
main.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x1b): undefined reference to `qt_plugin_instance_jmediaplayer()'
collect2: выполнение ld завершилось с кодом возврата 1

В асистенте все перечитал , примеры все персмотрел , форум читал ... все вроде сделано правильно а нехочет компилится. Уже и пересобирал весь проект несчетное количесвто раз.


подскажите что не так .


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: lit-uriy от Май 21, 2008, 18:34
дык, при статической линковке, плагины курят бамбук, читай руководство Развертывание приложений Qt (http://crossplatform.ru/documentation/qtdoc4.3/deployment.php)


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: ритт от Май 21, 2008, 18:40
при статической линковке плагины можно линковать только статически (круг круглый)...т.е. это и не плагины вовсе уже будут, но их можно будет увидеть в списке статических плагинов (курить QLibrary/QPlugin)
в ассистанте всё это есть


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: izoomer от Май 21, 2008, 21:01
при статической линковке плагины можно линковать только статически (круг круглый)...т.е. это и не плагины вовсе уже будут, но их можно будет увидеть в списке статических плагинов (курить QLibrary/QPlugin)
в ассистанте всё это есть

подскажите мне дальнейший шаг ... я так понимаю что надо пересобрать все QT динамически . Правильно ?
или мне надо только что то настроить в pro файле проекта ?

P.S. QT собиралось по умолчанию .


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: ритт от Май 21, 2008, 21:15
убрать static из проект{а,ов} - вместо него вписать shared
да...Q_IMPORT_PLUGIN(jmediaplayer); - тоже убрать - это нужно для статических "плагинов"
для динамических нужно пользовать плагинлоадер


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: izoomer от Май 21, 2008, 21:34
убрать static из проект{а,ов} - вместо него вписать shared
да...Q_IMPORT_PLUGIN(jmediaplayer); - тоже убрать - это нужно для статических "плагинов"
для динамических нужно пользовать плагинлоадер

а если мне нужны именно статические плагины ?
ну то есть у меня есть несколько классов которые используются в несокльких проектах, так вот ... я хотел эти классы выдвинуть в плагины и собирать конечные приложения единым файлом, поскольку у меня приложение должно быть одним файлом .... как быть ?


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: ритт от Май 21, 2008, 22:08
> а если мне нужны именно статические плагины ?
тогда похоже, что делаешь правильно

приложи архив с сорцами - попробую у себя запустить


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: Alex03 от Май 22, 2008, 05:42
а если мне нужны именно статические плагины ?
ну то есть у меня есть несколько классов которые используются в несокльких проектах, так вот ... я хотел эти классы выдвинуть в плагины и собирать конечные приложения единым файлом, поскольку у меня приложение должно быть одним файлом .... как быть ?
А зачем тогда плагины то? Сделай библиотечку (статическую) и пользуй её...


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: ритт от Май 22, 2008, 07:34
небольшое отличие всё же есть...скажем, хочется показать jmediaplayer в списке плагинов, но по каким-то причинам нет смысла делать его динамическим


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: izoomer от Май 22, 2008, 11:03
> а если мне нужны именно статические плагины ?
тогда похоже, что делаешь правильно

приложи архив с сорцами - попробую у себя запустить

та в приниципе в моем сообщении это и есть соурсы тестовые ... обычная main из шаблона KDevelop .


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: izoomer от Май 22, 2008, 11:24
а если мне нужны именно статические плагины ?
ну то есть у меня есть несколько классов которые используются в несокльких проектах, так вот ... я хотел эти классы выдвинуть в плагины и собирать конечные приложения единым файлом, поскольку у меня приложение должно быть одним файлом .... как быть ?
А зачем тогда плагины то? Сделай библиотечку (статическую) и пользуй её...

а что для этого надо поменять в приведенном мною примере ?


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: Alex03 от Май 22, 2008, 13:24
а что для этого надо поменять в приведенном мною примере ?
Выкинуть всё что касается плагинов...

Почитать QTDIR/doc/html/qmake-common-projects.html#building-a-library и т.д.
Для проекта библиотеки
Код:
TEMPLATE        = lib
CONFIG           += staticlib


Для проекта прог использующих библиотеку указать либу/пути к хидерам.
Почитать тут: QTDIR/doc/html/qmake-project-files.html#declaring-other-libraries

Вроде бы всё, если библиотеку не статическую делать, то ещё импорт/экспорт указать в исходниках...


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: izoomer от Май 22, 2008, 15:00
> а если мне нужны именно статические плагины ?
тогда похоже, что делаешь правильно

приложи архив с сорцами - попробую у себя запустить

с эти разобрался, все комплится ... вчера ечером букву не так поставил .. заработался ... в путях пыла ошибка (JMediaPlayerPlugin != JMediaPlayerPlugin(S))

теперь вопрос как все это использовать. Написал метод в плагине

Код:
int JMediaPlayerPlugin::getVolume()
{
return 14;
}

в интерфейсе объявил его virtual
Код:
virtual int getVolume();

вставил в другом файле проекта mainwindow.cpp:
Код:
	JMediaPlayer * my_player = new JMediaPlayer();
qDebug() << "volume = " << my_player->getVolume();

а он ругается :
Код:
mainwindow.o: In function `MainWindow::init()':
mainwindow.cpp:(.text+0x5210): undefined reference to `vtable for JMediaPlayer'
mainwindow.cpp:(.text+0x5219): undefined reference to `vtable for JMediaPlayer'
../libjplayer/JMediaPlayerPlugin/src/libjmediaplayer.a(moc_JMediaPlayerPlugin.o):(.data.rel.ro._ZTI18JMediaPlayerPlugin[typeinfo for JMediaPlayerPlugin]+0x18): undefined reference to `typeinfo for JMediaPlayer'
collect2: выполнение ld завершилось с кодом возврата 1


все сделал как в примере.
Что не так опять ?

К: * подправил тэги код


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: izoomer от Май 22, 2008, 16:01
поленился примеры до конца глянуть ...
все сделал так как надо ... вроде вот так вот надо :
Код:
	foreach (QObject *plugin, QPluginLoader::staticInstances()){
JMediaPlayer * my_player = qobject_cast<JMediaPlayer *>(plugin);
if (my_player)
                                       qDebug() << my_player->getVolume();
}


а он опять таки ругается все таки ...
Код:
../libjplayer/JMediaPlayerPlugin/src/libjmediaplayer.a(moc_JMediaPlayerPlugin.o):(.data.rel.ro._ZTI18JMediaPlayerPlugin[typeinfo for JMediaPlayerPlugin]+0x18): undefined reference to `typeinfo for JMediaPlayer'
collect2: выполнение ld завершилось с кодом возврата 1

подскажите что не так ?


Название: Re: [qt-4.4.0 Linux] Работа с плагинами - начало.
Отправлено: izoomer от Май 23, 2008, 12:48
поленился примеры до конца глянуть ...
все сделал так как надо ... вроде вот так вот надо :
Код:
	foreach (QObject *plugin, QPluginLoader::staticInstances()){
JMediaPlayer * my_player = qobject_cast<JMediaPlayer *>(plugin);
if (my_player)
                                       qDebug() << my_player->getVolume();
}


а он опять таки ругается все таки ...
Код:
../libjplayer/JMediaPlayerPlugin/src/libjmediaplayer.a(moc_JMediaPlayerPlugin.o):(.data.rel.ro._ZTI18JMediaPlayerPlugin[typeinfo for JMediaPlayerPlugin]+0x18): undefined reference to `typeinfo for JMediaPlayer'
collect2: выполнение ld завершилось с кодом возврата 1

подскажите что не так ?

Сам в общем разобрался.

У кого будут проблемы со статическими плагинами в Qt-4.4.0 вот решение.

Цитировать
This is caused by the fact that Qt/E is compiled with -fno-rtti by default to
save space.
Either compile Qt/E without -fno-rtti (you can do that by patching qmake
configs), or try compiling your app with -fno-rtti as well (this may or may
not work, depending on what types of casts it uses).

я вписал в .pro файлы главного проекта и самого плагина

Код:
QMAKE_CXXFLAGS += -fno-rtti

и пересобрал все ...
и все заработало

Все спасибо.