Russian Qt Forum
Мая 09, 2025, 13:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Qt и плагины (undefined symbol)  (Прочитано 22174 раз)
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? Везде происказ, ничего не нашел нужного:(
Записан
vregess
Гость
« Ответ #1 : Февраля 26, 2008, 18:40 »

попробуй Q_EXPORT_PLUGIN2
Записан
zodiac
Гость
« Ответ #2 : Февраля 26, 2008, 18:52 »

Сделал так: Q_EXPORT_PLUGIN2(testPlugin, testPlugin);
Все равно также выскакивает.
Записан
BRE
Гость
« Ответ #3 : Февраля 26, 2008, 19:05 »

Попробуй так:
class pluginInterface
{
...
};

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

Читай внимательно Assistant.  Подмигивающий
Записан
zodiac
Гость
« Ответ #4 : Февраля 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")

все равно. ассистента читал, по-всякому уже пробовал
Записан
BRE
Гость
« Ответ #5 : Февраля 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.
Записан
zodiac
Гость
« Ответ #6 : Февраля 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 вычитал)
Записан
Вячеслав
Гость
« Ответ #7 : Февраля 26, 2008, 19:40 »

Конструктора может сделать ? Ы ?
Записан
BRE
Гость
« Ответ #8 : Февраля 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, которого ему не хватает. А точно пытаешься загрузить именно этот файл, может старый файл остался в директории откуда грузишь плагин?
Записан
Вячеслав
Гость
« Ответ #9 : Февраля 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 случаем ?
Записан
BRE
Гость
« Ответ #10 : Февраля 26, 2008, 19:50 »

А U это не undefined случаем ?
Парюсь, именно это.  Смеющийся
А вот что ему надо???
Записан
BRE
Гость
« Ответ #11 : Февраля 26, 2008, 19:54 »

Ну попробуй так:
Q_EXPORT_PLUGIN2(testplugin, testPlugin);

Это я Echo Plugin Example смотрю.  Подмигивающий
Записан
Вячеслав
Гость
« Ответ #12 : Февраля 26, 2008, 20:02 »

Таки вять того ,кто умеет из _ZTV10testPlugin сделать нормальное имя и поглядеть - кто нужен ....
А вообще сделай плагину конструктора и деструктора - может полегчает Подмигивающий
Записан
BRE
Гость
« Ответ #13 : Февраля 26, 2008, 20:08 »

Пересобери весь проект (make distclean; qmake-qt4; make), этот символ определяется в moc-файле. Похоже moc файл не подключается.
Записан
vaprele07
Гость
« Ответ #14 : Февраля 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
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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