Russian Qt Forum

Qt => Общие вопросы => Тема начата: zodiac от Февраль 26, 2008, 18:03



Название: Qt и плагины (undefined symbol)
Отправлено: zodiac от Февраль 26, 2008, 18:03
Плагинный интерфейс:
Код:
#include <QObject>
#include <QtCore>
#include <QString>

class pluginInterface : public QObject
{
public:
virtual ~pluginInterface() {}
virtual QString getAuthor() = 0;
};

Q_DECLARE_INTERFACE (pluginInterface, "zodiac.pluginInterface/1.0")

Плагин:
Код:
#include <QtCore>
#include "../pluginInterface.h"

class testPlugin : public pluginInterface
{
Q_OBJECT
Q_INTERFACES(pluginInterface)

public:
QString getAuthor()
{
return "zodiac";
}
};

Q_EXPORT_PLUGIN(testPlugin);

Вызов из программы:
Код:
	pluginsDir = QDir(qApp->applicationDirPath());

pluginsDir.cd("plugins");

foreach (pluginFileName, pluginsDir.entryList(QDir::Files))
{
QPluginLoader loader(pluginsDir.absoluteFilePath(pluginFileName));
plugin = loader.instance();

QMessageBox::information(0, "!!!", loader.errorString());
}

Выдает следущее:
QLibrary::load_sys: Cannot load /home..../libtest_plugin.so (/home..../libtest_plugin.so: undefined symbol: _ZTV10testPlugin)
Что это за такой undefined symbol? Везде происказ, ничего не нашел нужного:(


Название: Re: Qt и плагины (undefined symbol)
Отправлено: vregess от Февраль 26, 2008, 18:40
попробуй Q_EXPORT_PLUGIN2


Название: Re: Qt и плагины (undefined symbol)
Отправлено: zodiac от Февраль 26, 2008, 18:52
Сделал так: Q_EXPORT_PLUGIN2(testPlugin, testPlugin);
Все равно также выскакивает.


Название: Re: Qt и плагины (undefined symbol)
Отправлено: BRE от Февраль 26, 2008, 19:05
Попробуй так:
class pluginInterface
{
...
};

class testPlugin : public QObject, public pluginInterface
{
...
};

Читай внимательно Assistant.  ;)


Название: Re: Qt и плагины (undefined symbol)
Отправлено: zodiac от Февраль 26, 2008, 19:11
Код:
#include <QtCore>
#include "../pluginInterface.h"

class testPlugin : public QObject, public pluginInterface
{
Q_OBJECT
Q_INTERFACES(pluginInterface)

public:
QString getAuthor()
{
return "zodiac";
}
};

Q_EXPORT_PLUGIN2(testPlugin, testPlugin);

Код:
#include <QObject>
#include <QtCore>
#include <QString>

class pluginInterface
{
public:
virtual ~pluginInterface() {}
virtual QString getAuthor() = 0;
};

Q_DECLARE_INTERFACE (pluginInterface, "zodiac.pluginInterface/1.0")

все равно. ассистента читал, по-всякому уже пробовал


Название: Re: Qt и плагины (undefined symbol)
Отправлено: BRE от Февраль 26, 2008, 19:25
Может дело в этом?

When building plugins to extend an application, it is important to ensure that the plugin is configured in the same way as the application. This means that if the application was built in release mode, plugins should be built in release mode, too.
If you configure Qt to be built in both debug and release modes, but only build applications in release mode, you need to ensure that your plugins are also built in release mode. By default, if a debug build of Qt is available, plugins will only be built in debug mode. To force the plugins to be built in release mode, add the following line to the plugin's project file:
 CONFIG += release
This will ensure that the plugin is compatible with the version of the library used in the application.


Название: Re: Qt и плагины (undefined symbol)
Отправлено: zodiac от Февраль 26, 2008, 19:34
Не помогло.
Код:
zodiac@zodiac ~/Desktop/crypt/main/plugins $ nm libtest_plugin.so
00002034 d DW.ref.__gxx_personality_v0
00001e6c a _DYNAMIC
00001ff4 a _GLOBAL_OFFSET_TABLE_
         w _Jv_RegisterClasses
         U _Unwind_Resume@@GCC_3.0
00002040 b _ZGVZ18qt_plugin_instanceE9_instance
         U _ZN11QMetaObject11changeGuardEPP7QObjectS1_
         U _ZN11QMetaObject11removeGuardEPP7QObject
00000be0 W _ZN15pluginInterfaceD0Ev
00000c10 W _ZN15pluginInterfaceD1Ev
         U _ZN7QObjectC2EPS_
00001e64 V _ZTI15pluginInterface
00000ca0 V _ZTS15pluginInterface
         U _ZTV10testPlugin
00001e50 V _ZTV15pluginInterface
         U _ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
00002048 b _ZZ18qt_plugin_instanceE9_instance
         U _ZdlPv@@GLIBCXX_3.4
         U _Znwj@@GLIBCXX_3.4
....
Может поможет как-то? (где-то на англ. форуме про nm вычитал)


Название: Re: Qt и плагины (undefined symbol)
Отправлено: Вячеслав от Февраль 26, 2008, 19:40
Конструктора может сделать ? Ы ?


Название: Re: Qt и плагины (undefined symbol)
Отправлено: BRE от Февраль 26, 2008, 19:41
Не помогло.
Код:
zodiac@zodiac ~/Desktop/crypt/main/plugins $ nm libtest_plugin.so
00002034 d DW.ref.__gxx_personality_v0
00001e6c a _DYNAMIC
00001ff4 a _GLOBAL_OFFSET_TABLE_
         w _Jv_RegisterClasses
         U _Unwind_Resume@@GCC_3.0
00002040 b _ZGVZ18qt_plugin_instanceE9_instance
         U _ZN11QMetaObject11changeGuardEPP7QObjectS1_
         U _ZN11QMetaObject11removeGuardEPP7QObject
00000be0 W _ZN15pluginInterfaceD0Ev
00000c10 W _ZN15pluginInterfaceD1Ev
         U _ZN7QObjectC2EPS_
00001e64 V _ZTI15pluginInterface
00000ca0 V _ZTS15pluginInterface
         U _ZTV10testPlugin                                            <<<<<<<<<<<<<<<<<<<<<<<<
00001e50 V _ZTV15pluginInterface
         U _ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
00002048 b _ZZ18qt_plugin_instanceE9_instance
         U _ZdlPv@@GLIBCXX_3.4
         U _Znwj@@GLIBCXX_3.4
....
Может поможет как-то? (где-то на англ. форуме про nm вычитал)

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


Название: Re: Qt и плагины (undefined symbol)
Отправлено: Вячеслав от Февраль 26, 2008, 19:44
Не помогло.
Код:
zodiac@zodiac ~/Desktop/crypt/main/plugins $ nm libtest_plugin.so
00002034 d DW.ref.__gxx_personality_v0
00001e6c a _DYNAMIC
00001ff4 a _GLOBAL_OFFSET_TABLE_
         w _Jv_RegisterClasses
         U _Unwind_Resume@@GCC_3.0
00002040 b _ZGVZ18qt_plugin_instanceE9_instance
         U _ZN11QMetaObject11changeGuardEPP7QObjectS1_
         U _ZN11QMetaObject11removeGuardEPP7QObject
00000be0 W _ZN15pluginInterfaceD0Ev
00000c10 W _ZN15pluginInterfaceD1Ev
         U _ZN7QObjectC2EPS_
00001e64 V _ZTI15pluginInterface
00000ca0 V _ZTS15pluginInterface
         U _ZTV10testPlugin                                            <<<<<<<<<<<<<<<<<<<<<<<<
00001e50 V _ZTV15pluginInterface
         U _ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
00002048 b _ZZ18qt_plugin_instanceE9_instance
         U _ZdlPv@@GLIBCXX_3.4
         U _Znwj@@GLIBCXX_3.4
....
Может поможет как-то? (где-то на англ. форуме про nm вычитал)

Странно, вот тот symbol, которого ему не хватает. А точно пытаешься загрузить именно этот файл, может старый файл остался в директории откуда грузишь плагин?
А U это не undefined случаем ?


Название: Re: Qt и плагины (undefined symbol)
Отправлено: BRE от Февраль 26, 2008, 19:50
А U это не undefined случаем ?
Парюсь, именно это.  ;D
А вот что ему надо???


Название: Re: Qt и плагины (undefined symbol)
Отправлено: BRE от Февраль 26, 2008, 19:54
Ну попробуй так:
Q_EXPORT_PLUGIN2(testplugin, testPlugin);

Это я Echo Plugin Example смотрю.  ;)


Название: Re: Qt и плагины (undefined symbol)
Отправлено: Вячеслав от Февраль 26, 2008, 20:02
Таки вять того ,кто умеет из _ZTV10testPlugin сделать нормальное имя и поглядеть - кто нужен ....
А вообще сделай плагину конструктора и деструктора - может полегчает ;)


Название: Re: Qt и плагины (undefined symbol)
Отправлено: BRE от Февраль 26, 2008, 20:08
Пересобери весь проект (make distclean; qmake-qt4; make), этот символ определяется в moc-файле. Похоже moc файл не подключается.


Название: Re: Qt и плагины (undefined symbol)
Отправлено: vaprele07 от Февраль 27, 2008, 04:30
Q_EXPORT_PLUGIN2(testplugin, testPlugin) вот это у тебя должно где находиться? :) правильно! где-нибудь в объектном модуле, а оно у тебя в заголовке...

и еще интересное для qobject_cast важен порядок:
Код:
class testPlugin : public QObject, public pluginInterface
к примеру так работать не будет:
Код:
class testPlugin : public pluginInterface, public QObject

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


Название: Re: Qt и плагины (undefined symbol)
Отправлено: zodiac от Февраль 27, 2008, 12:52
Сделал вот так:
test_plugin.h:
Код:
#include <QtCore>
#include "../pluginInterface.h"

class testPlugin : public QObject, public pluginInterface
{
Q_OBJECT
Q_INTERFACES(pluginInterface)

public:
QString getAuthor()
{
return "zodiac";
}
};
test_plugin.cpp:
Код:
#include "test_plugin.h"
Q_EXPORT_PLUGIN2(testplugin, testPlugin);

Перекомпилировал все. Теперь пишет: "Unknown error"


Название: Re: Qt и плагины (undefined symbol)
Отправлено: Вячеслав от Февраль 27, 2008, 13:11
strace натрави ..... strace твоя_программа
А вообще - давай полные исходники проекта - посмотрим


Название: Re: Qt и плагины (undefined symbol)
Отправлено: zodiac от Февраль 27, 2008, 13:14
Щас echoplugin взял из ассистента. Все сделал как написано, в итоге:
Цитировать
zodiac@zodiac ~/Desktop/echoplugin/echowindow $ ./echowindow
ASSERT: "!isEmpty()" in file /usr/include/qt4/QtCore/qlist.h, line 242
Аварийный останов
zodiac@zodiac ~/Desktop/echoplugin/echowindow $


Название: Re: Qt и плагины (undefined symbol)
Отправлено: zodiac от Февраль 27, 2008, 13:31
Разобрался с ошибкой echo, теперь также пишет: "Unknown error".


Название: Re: Qt и плагины (undefined symbol)
Отправлено: Вячеслав от Февраль 27, 2008, 13:40
............................................... сказал боцман и начал грязно ругаться ...
Ну дерни ты свою прогу через strace - оно тебе скаже че ему надо


Название: Re: Qt и плагины (undefined symbol)
Отправлено: zodiac от Февраль 27, 2008, 13:47
дак а я не знаю чего там смотреть-то.


Название: Re: Qt и плагины (undefined symbol)
Отправлено: Вячеслав от Февраль 27, 2008, 13:55
ткни в командной строке strace ТвойПрог >out
а далее в out глазками поищи где оно рушиться ....
ЗЫ Ну кинь ты полные исходники своего проекта - легче будет ....


Название: Re: Qt и плагины (undefined symbol)
Отправлено: zodiac от Февраль 27, 2008, 14:18
А исходники EchoPlugin из ассистента) Там тоже такая же ошибка.
А у тебя нет простого проекта, который юзает плагины? Как бы шаблон просто.


Название: Re: Qt и плагины (undefined symbol)
Отправлено: Вячеслав от Февраль 27, 2008, 14:29
Гы ;) я с plug&paint'a все содрал ;) Щаз простых проектов уже не найти :(
Таки чем p&p В качестве простого примера не подходит ?


Название: Re: Qt и плагины (undefined symbol)
Отправлено: zodiac от Февраль 27, 2008, 14:46
Все, что имеется сейчас:
/cryptMain.cpp:
Код:
#include "cryptMain.h"
#include "pluginInterface.h"
#include <QtGui>
#include <QMessageBox>

cryptMain::cryptMain(QWidget *parent) : QMainWindow(parent)
{
setupUi(this);

pluginsDir = QDir(qApp->applicationDirPath());

pluginsDir.cd("plugins");

foreach (pluginFileName, pluginsDir.entryList(QDir::Files))
{
QPluginLoader loader(pluginsDir.absoluteFilePath(pluginFileName));
plugin = loader.instance();

/*if (loader.isLoaded())
{
pluginInterface *plg = qobject_cast<pluginInterface *>(plugin);
QMessageBox::information(0, "!!!", plg->getAuthor());
}*/

QMessageBox::information(0, "!!!", loader.errorString());
}

/*QPluginLoader loader("plugins/libtest_plugin.so");

if (!loader.load())
{
QMessageBox::information(0, "!!!", loader.errorString());
}*/
}
/cryptMain.h:
Код:
#include <QPluginLoader>
#include <QMessageBox>
#include <QDir>
#include "ui_cryptMain.h"

class cryptMain : public QMainWindow, private Ui::cryptMain
{
    Q_OBJECT

public:
    cryptMain(QWidget *parent = 0);

private slots:

private:
QObject *plugin;

//QPluginLoader loader;

QDir pluginsDir;

QString pluginFileName;
};
/cryptMain.ui:
формочка:)
/main.cpp:
Код:
#include <QApplication>
#include "pluginInterface.h"
#include "cryptMain.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    cryptMain form;
    form.show();

    return app.exec();
}
/main.pro:
Код:
######################################################################
# Automatically generated by qmake (2.01a) Thu Feb 21 18:17:20 2008
######################################################################

TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += cryptMain.h
FORMS += cryptMain.ui
SOURCES += cryptMain.cpp main.cpp
/pluginInterface.h:
Код:
#include <QObject>
#include <QtCore>
#include <QString>

class pluginInterface
{
public:
virtual ~pluginInterface() {}
virtual QString getAuthor() = 0;
};

Q_DECLARE_INTERFACE (pluginInterface, "zodiac.pluginInterface/1.0")
/main/plugins/plugins.pro:
Код:
######################################################################
# Automatically generated by qmake (2.01a) Wed Feb 27 14:45:38 2008
######################################################################

TEMPLATE = lib
CONFIG += plugin
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += test_plugin.h ../pluginInterface.h
SOURCES += test_plugin.cpp
/main/plugins/test_plugin.cpp:
Код:
#include "test_plugin.h"
Q_EXPORT_PLUGIN2(testplugin, testPlugin);
/main/plugins/test_plugin.h:
Код:
#include <QtCore>
#include "../pluginInterface.h"

class testPlugin : public QObject, public pluginInterface
{
Q_OBJECT
Q_INTERFACES(pluginInterface)

public:
QString getAuthor()
{
return "zodiac";
}
};


Название: Re: Qt и плагины (undefined symbol)
Отправлено: Вячеслав от Февраль 27, 2008, 14:59
типа эта плагин - твой
загрузчик мой
Код:
#include "pluginInterface.h "

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QPluginLoader loader("plugins/debug/testd.dll");
QObject *plugin = loader.instance();
if(plugin)
{
pluginInterface *plg = qobject_cast<pluginInterface *>(plugin);
if(plg)
QMessageBox::information(0, "!!!", plg->getAuthor());
else
QMessageBox::information(0, "error", "qobject_cast fail");
}
else
QMessageBox::information(0, "error", loader.errorString ());

return 0;
Работает однако ;)

pS и в форточках и под Дебианом ;) .....


Название: Re: Qt и плагины (undefined symbol)
Отправлено: zodiac от Февраль 27, 2008, 15:18
Ого! Работает:) Спасибо.


Название: Re: Qt и плагины (undefined symbol)
Отправлено: Вячеслав от Февраль 27, 2008, 15:32
 ;D ;D ;D Удачи ;)


Название: Re: Qt и плагины (undefined symbol)
Отправлено: zodiac от Февраль 28, 2008, 12:51
А если использовать этот загрузчик несколько раз, то старый плагин обязательно как-либо выгружать?


Название: Re: Qt и плагины (undefined symbol)
Отправлено: Вячеслав от Февраль 28, 2008, 13:29
А нафига ? Плагин выгружаеться когда убиваеться последняя ссылка на то,что вернул instance()...
В том-же p&p они тупо в цикле грузят одним лоадером пачку плагинов ....


Название: Re: Qt и плагины (undefined symbol)
Отправлено: zodiac от Февраль 28, 2008, 13:33
Все. Ясненько. Спасибо!


Название: Re: Qt и плагины (undefined symbol)
Отправлено: -QT- от Сентябрь 08, 2008, 15:27
Доброго времени суток All !
Не хочу открывать новую тему, так как проблема идентична.
Все варианты приведенные в обсуждении проверил. До этого плагин грузился и работал
без проблем. Что поменял в плагине непомню - изменения были по мелочи теперь не работает и
выдает такую же ошибку.
Подскажите что это всетаки и как можно отловить ошибку в плагине, есть ли отладка плагина.
ведь при сборке и линковке ошибок нет.

Заранее благодарен за помощь.