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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [qt-4.4.0 Linux] Работа с плагинами - начало.  (Прочитано 9622 раз)
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

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


подскажите что не так .
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Май 21, 2008, 18:34 »

дык, при статической линковке, плагины курят бамбук, читай руководство Развертывание приложений Qt
Записан

Юра.
ритт
Гость
« Ответ #2 : Май 21, 2008, 18:40 »

при статической линковке плагины можно линковать только статически (круг круглый)...т.е. это и не плагины вовсе уже будут, но их можно будет увидеть в списке статических плагинов (курить QLibrary/QPlugin)
в ассистанте всё это есть
Записан
izoomer
Гость
« Ответ #3 : Май 21, 2008, 21:01 »

при статической линковке плагины можно линковать только статически (круг круглый)...т.е. это и не плагины вовсе уже будут, но их можно будет увидеть в списке статических плагинов (курить QLibrary/QPlugin)
в ассистанте всё это есть

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

P.S. QT собиралось по умолчанию .
Записан
ритт
Гость
« Ответ #4 : Май 21, 2008, 21:15 »

убрать static из проект{а,ов} - вместо него вписать shared
да...Q_IMPORT_PLUGIN(jmediaplayer); - тоже убрать - это нужно для статических "плагинов"
для динамических нужно пользовать плагинлоадер
Записан
izoomer
Гость
« Ответ #5 : Май 21, 2008, 21:34 »

убрать static из проект{а,ов} - вместо него вписать shared
да...Q_IMPORT_PLUGIN(jmediaplayer); - тоже убрать - это нужно для статических "плагинов"
для динамических нужно пользовать плагинлоадер

а если мне нужны именно статические плагины ?
ну то есть у меня есть несколько классов которые используются в несокльких проектах, так вот ... я хотел эти классы выдвинуть в плагины и собирать конечные приложения единым файлом, поскольку у меня приложение должно быть одним файлом .... как быть ?
Записан
ритт
Гость
« Ответ #6 : Май 21, 2008, 22:08 »

> а если мне нужны именно статические плагины ?
тогда похоже, что делаешь правильно

приложи архив с сорцами - попробую у себя запустить
Записан
Alex03
Гость
« Ответ #7 : Май 22, 2008, 05:42 »

а если мне нужны именно статические плагины ?
ну то есть у меня есть несколько классов которые используются в несокльких проектах, так вот ... я хотел эти классы выдвинуть в плагины и собирать конечные приложения единым файлом, поскольку у меня приложение должно быть одним файлом .... как быть ?
А зачем тогда плагины то? Сделай библиотечку (статическую) и пользуй её...
Записан
ритт
Гость
« Ответ #8 : Май 22, 2008, 07:34 »

небольшое отличие всё же есть...скажем, хочется показать jmediaplayer в списке плагинов, но по каким-то причинам нет смысла делать его динамическим
Записан
izoomer
Гость
« Ответ #9 : Май 22, 2008, 11:03 »

> а если мне нужны именно статические плагины ?
тогда похоже, что делаешь правильно

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

та в приниципе в моем сообщении это и есть соурсы тестовые ... обычная main из шаблона KDevelop .
Записан
izoomer
Гость
« Ответ #10 : Май 22, 2008, 11:24 »

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

а что для этого надо поменять в приведенном мною примере ?
Записан
Alex03
Гость
« Ответ #11 : Май 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

Вроде бы всё, если библиотеку не статическую делать, то ещё импорт/экспорт указать в исходниках...
Записан
izoomer
Гость
« Ответ #12 : Май 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


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

К: * подправил тэги код
« Последнее редактирование: Май 22, 2008, 15:03 от Константин » Записан
izoomer
Гость
« Ответ #13 : Май 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

подскажите что не так ?
Записан
izoomer
Гость
« Ответ #14 : Май 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

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

Все спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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