LINUX.ORG.RU

[Qt][Plugins] Не подгружается плагин.


0

1

Уже не знаю где искать, помогите пожалуйста. Делал всё как в примере Echo Plugin, вот тут исходники. Подгружается плагин вот здесь. В errorString плюет что-то подобное:

/home/georg/qgt/lib/qgoogletranslator/libgoogletranslate.so: undefined symbol: _ZTV15Googletranslate)"

georg@citadel:~$ ldd -d /home/georg/qgt/lib/qgoogletranslator/libgoogletranslate.so
        linux-gate.so.1 =>  (0xb78bb000)
        libQtGui.so.4 => /usr/lib/libQtGui.so.4 (0xb6df0000)
        libQtCore.so.4 => /usr/lib/libQtCore.so.4 (0xb6b6c000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6a76000)
        libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb6a50000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb6a32000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb68ec000)
        libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb68bd000)
        libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb68a3000)
        libaudio.so.2 => /usr/lib/libaudio.so.2 (0xb688d000)
        libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0xb67c4000)
        libpng12.so.0 => /lib/libpng12.so.0 (0xb67a0000)
        libz.so.1 => /usr/lib/libz.so.1 (0xb678c000)
        libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb6715000)
        libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb66d6000)
        libSM.so.6 => /usr/lib/libSM.so.6 (0xb66ce000)
        libICE.so.6 => /usr/lib/libICE.so.6 (0xb66b6000)
        libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb66ad000)
        libXext.so.6 => /usr/lib/libXext.so.6 (0xb669e000)
        libX11.so.6 => /usr/lib/libX11.so.6 (0xb6580000)
        libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb657c000)
        libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb6577000)
        librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb656e000)
        /lib/ld-linux.so.2 (0xb78bc000)
        libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb6548000)
        libXt.so.6 => /usr/lib/libXt.so.6 (0xb64f6000)
        libXau.so.6 => /usr/lib/libXau.so.6 (0xb64f2000)
        libpcre.so.3 => /lib/libpcre.so.3 (0xb64bf000)
        libuuid.so.1 => /lib/libuuid.so.1 (0xb64bb000)
        libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb64a2000)
        libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb649d000)
undefined symbol: _ZTV8GetReply (/home/georg/qgt/lib/qgoogletranslator/libgoogletranslate.so)
undefined symbol: _ZTV15Googletranslate (/home/georg/qgt/lib/qgoogletranslator/libgoogletranslate.so)
undefined symbol: _ZTV11Plinterface     (/home/georg/qgt/lib/qgoogletranslator/libgoogletranslate.so)
georg@citadel:~$ 

В аналогичной ситуации с плагином для MySQL при переносе на другую машину потребовалось положить сам плагин (qsqlmysql4.dll) в директорию sqldrivers, созданную рядом с исполняемым файлом. Возможно, Ваш плагин надо поместить в директорию plugins?

braboar ()
Ответ на: комментарий от braboar

Это тут причем? Ты и в юниксе предлагаешь таскать вот так программу? Да и ошибка совсем не похожа на то, чтобы причина была в этом.

flareguner ()

А откуда эти символы должны быть вытащены?

namezys ★★★★ ()
Ответ на: комментарий от namezys

Googletranslate - сам класс плагина Plinterface - его интерфейс. GetReply - класс, который просто инклудится туда. я его даже пробовал добавить в плагинов CMakeLitst

flareguner ()
Ответ на: комментарий от flareguner

Коротко говоря, он не может найти таблицы виртуальных функций.

этот код вы писали?

namezys ★★★★ ()
Ответ на: комментарий от flareguner

Для начала get ready Запустите компиляцию, проверте, что getready.cpp линкуется с либой

namezys ★★★★ ()
Ответ на: комментарий от namezys

Кстати, я пробовал делать так: тупо скопипастил функции нужные из класса GetReply в класс плагина, тогда ругалось на сам класс плагина. Что за фигня? Даже меняуже разозлило всё это.

flareguner ()
Ответ на: комментарий от flareguner

make clean make debug

и смотреть, какией файлы собираются

Но я, как понимаю, get ready входит в основной проект, а не в плагин?

namezys ★★★★ ()
Ответ на: комментарий от namezys

Но я, как понимаю, get ready входит в основной проект, а не в плагин?

Он валяется в основном проекте, а там просто инклудится.

flareguner ()
Ответ на: комментарий от namezys

Реализация cfgDialog в плагине класса. Ссылки я уже дал в первом сообщении, ИХМО там легче глянуть, чем сюда копипастить.

flareguner ()
Ответ на: комментарий от flareguner

Отлично. А как линкер динамической библиотеки должен искать реализацию. У тебя циклическая ссылка (пытаемся подгрузить библиоетку, надо подгрузить реализацию, для этого надо подгрзить основной код и тд). Да, в линуксе это можно обойти, но в windows или mac os нельзая

у тебя должно быть так: lib: common, sh-lib: plugin, app: main

main может включать common. plugin обязан включать common, так как использует его

namezys ★★★★ ()
Ответ на: комментарий от flareguner

Plinterface - не вижу, где вообще декларируются его методы

namezys ★★★★ ()
Ответ на: комментарий от flareguner

Можно делать и динамической, тогда plugin должен зависит от него. Можно сделать статической, и включить в плагин. Это как хочется, и как целесообразнее (имхо второе лучше для МАЛЕНЬКИХ библиотек)

ТЫК? куда? на класс наслдений? А я что спросил? Где декларируется нечистовиртуальный метод КЛАССА Plinterface, а не его наследника

namezys ★★★★ ()
Ответ на: комментарий от namezys

Какой ещё нечистовиртуальный? чисто виртуальный объявляется в интерфейсе, а в googletranslate реализуется.

flareguner ()
Ответ на: комментарий от flareguner

Plinterface::cfgDialog является просто виртаульным методом с реализацией. Где она? Может =0 забыл?

namezys ★★★★ ()
Ответ на: комментарий от namezys

_ZTV - это таблицы виртаульных функций. Обычно они немогут быть созданны, если не может отработать линковка таблиц виртаульных функций на реальные куски кода (если стоит = 0, то линковка не производится)

namezys ★★★★ ()
Ответ на: комментарий от flareguner

ну если что - пиши.

в общем 2 основные ошибка: нет реализации класса в данной библиотеке (или в любой зависимой). или забыл в интерфейсе =0 написать

namezys ★★★★ ()
Ответ на: комментарий от namezys

Спасибо. Я попробую компилить GetReply в статическую либу и линовать с ней плагин.

flareguner ()
Ответ на: комментарий от namezys

Фух, кажется все теперь работает. Теперь остается пилить и пилить.

flareguner ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.