Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: [Qt Plugins] Не подгружается плагин, прошу помощи.
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
flareguner
Доброго времени суток. Сразу замечу, что это репост моей темыс ЛОРа, надеюсь тут помогут оперативнее.

Уже не знаю где искать, помогите пожалуйста. Делал всё как в примере Echo Plugin. Подгружается плагин вот здесь. В errorString плюет что-то подобное:
/home/georg/qgt/lib/qgoogletranslator/libgoogletranslate.so: undefined symbol: _ZTV15Googletranslate)"


Вот что говорит ldd
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:~$


Версия Qt:
georg@citadel:~$ systemsettings -v
Qt: 4.6.3



Ссылка на сам плагин. Насчет qt4_wrap_cpp: не помогает, пробовал. Для сборки использую CMake, его конфиг можно узреть по ссылке на сорцы. Подсматривал в другом проекте, там всё точно так же реализованно. Помогите пожалуйста.


Уже разобрался, тема закрыта.
Алексей1153
Пытаюсь создать плагин, помогите кашу в голове в порядок привести ))

в общем, делал всё по инструкции из книги Блашнет. В дезайнере появился виджет, кладётся на форму, вид такой, как описан в классе в setStyleSheet

только когда начинаю компилировать проект, где используется плагин, оказывается, что в ui_*.h вставлен инклуд
#include "MyPlaginName.h"
путь к которому, естественно, не надодится, так как файл лежит в проекте плагина. Мне вручную нужно это файл куда-то скопировать ? То есть - в проект, использующий плагин ?
igor_bogomolov
Цитата(Алексей1153 @ 2.1.2011, 18:40) *
То есть - в проект, использующий плагин ?
Если я все правильно понял, ты сделал плагин для QtDesigner, поэтому единственный проект, который может твой плагин использовать, это опять же таки QtDesigner. Это нужно только для удобства разработки.
Если ты хочешь использовать этот виджет в своем проекте, ты должен добавить его в проект. Как ты уже это сделаешь, решать тебе. Я бы создал .pri файл для подключения его в проект.
Алексей1153
Понятно. А как такой файл сделать ? Поиск по сайту ничего не выдал
igor_bogomolov
Алексей1153, отдельного описания наверное нет, он имеет тот же синтаксис, что и файл проекта (.pro)
Просто с .pri файл часто выносят какие то общие настройки, а подключается он в .pro файле директивой include.
В твоём случае, на мой взгляд, было бы удобно сделать .pri файл для подключения твоего виджета в любой проект
Содержание примерно следущее
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
HEADERS += mywidget.h
SOURCES += mywidget.cpp
Litkevich Yuriy
Цитата(igor_bogomolov @ 3.1.2011, 21:32) *
HEADERS += mywidget.h
SOURCES += mywidget.cpp
лучше имя файла предварить переменной $$PWD:
HEADERS += $$PWD/mywidget.h
SOURCES += $$PWD/mywidget.cpp
иначе при теневой сборке могут возникнуть проблемы:
Алексей1153
спасибо за пинки в нужном направлении, но у меня попутно ещё вопросы:

значит, с точки зрения пользователя (программиста) виджета, должно происходить следующее (это мои догадки, их надо исправить в нужную сторону :) )

1) он получает в распоряжение модуль - в каком виде? Хедер+реализация+pro?
2) он компилирует pro'ект плагина, у него появляется *.dll и *.a (в винде. А не в винде?) в папке дизайнера + ему надо ещё закинуть исходники в проект, использующий этот виджет

так ?
Litkevich Yuriy
Обычно картина выглядит так:
Разработал виджет
Затем решил его использовать во многих своих приложениях - сделал каталог с исходниками и для удобства туда pri-файл.
Затем решил, что не дурно бы этот виджет использовать в дизайнере - сделал обёртку к нему по правилам плагинов дизайнера.
Теперь этот виджет, не изменяя его, можно не только в коде использовать, но и в дизайнере.

Прочитай эту статейку
Алексей1153
забыл отписаться о результатах вскрытия

в общем, схема вышла следующая:
имеется плагин X
исходники плагина положены в папку X, эту папку нужно скопировать в папку проекта, который будет ипользовать плагин
в папке плагина также лежит X.pri, в котором перечислены все инклуды в таком виде:
HEADERS+=./X/X.h
SOURCSE+=./X/X.cpp

в pro проекта (и в pro плагина тоже - для его сборки для дизайнера) нужно дописать

INCLUDEPATH+=X
include(X/X.pri)

собираем pro плагина. Дизайнер начинает понимать виджет
собираем проект-приёмник. Запускаем - всё нормально


и эту схему никак по другому не удаётся переделать - так и должно быть ?

ещё вопрос - как разрешать конфликты имён папок разных плагинов? Только уникальными названиями ?
Litkevich Yuriy
Цитата(Алексей1153 @ 8.1.2011, 18:42) *
эту папку нужно скопировать в папку проекта
нет не нужно, можно для плагинов отдельное место придумать, но тогда pri-файл должен выглядеть так:
HEADERS+=$$PWD/X/X.h
SOURCSE+=$$PWD/X/X.cpp

Переменная qmake $$PWD означает текущий каталог этого файла (т.е. данного pri-файла)

Цитата(Алексей1153 @ 8.1.2011, 18:42) *
как разрешать конфликты имён папок разных плагинов? Только уникальными названиями ?
с qmake главная проблема - одинаковые имена файлов, например, есть такие файлы
path/name.h
path/name.cpp
path/groupA/name.h
path/groupA/name.cpp

при компиляции получишь головняк. Т.к. qmake создаёт каталог для хранения объектников (например, debug) и там всё в одну кучу. А компилятор при компиляции cpp-файла создаёт одноимённый o-файл, т.е. получаем:
path/name.cpp => path/debug/name.o
path/groupA/name.cpp => path/debug/name.o

(при компиляции следующего name.cpp, предыдущий name.o будет перезаписан) :hang1:
Алексей1153
ага, с именами понятно.

а , кстати, чем отличается "./" от "$$PWD/" ?
Litkevich Yuriy
Цитата(Алексей1153 @ 8.1.2011, 20:15) *
а , кстати, чем отличается "./" от "$$PWD/" ?
$$PWD - текущий каталог файла, в котором находится эта запись.

Пример:
path/to/my.pro
CURRENT_VAR_1 = ./
CURRENT_VAR_2 = $$PWD

include(same/path/to/my.pri)


same/path/to/my.pri
CURRENT_1 = ./
CURRENT_2 = $$PWD

после сборки в одну кучу у qmake получится следующее:
CURRENT_VAR_1 = ./
CURRENT_VAR_2 = path/to/

CURRENT_1 = ./
CURRENT_2 = same/path/to/
Алексей1153
понятно
Алексей1153
и вот опять засада, не могу справиться - когда дело дошло до превращение в плагин двух и более виджетов, написал аналогичную обвеску для обоих, но при сборке происходит ругань на повторное использование макроса Q_EXPORT_PLUGIN2, хотя он упоминается в реализациях

текст ошибки - multuple definition of 'qt_plugin_instance'

а что делать то ? или для каждого виджетоплагина нужно свой pro делать ? Этож чокнуться можно
igor_bogomolov
Цитата(Алексей1153 @ 30.1.2011, 14:54) *
а что делать то ?
Внимательнее читать документацию. См. QDesignerCustomWidgetCollectionInterface
Алексей1153
Я видел про этот класс, но думал, он не для этих целей. Сейчас попробую поподробнее разобраться, спасибо
igor_bogomolov
Цитата(Алексей1153 @ 30.1.2011, 15:54) *
Сейчас попробую поподробнее разобраться, спасибо
Вот сюда глянь, сразу всё понятно станет
Или вот тут еще примерчик можешь подглядеть http://www.forum.crossplatform.ru/index.ph...ost&p=18019
Алексей1153
да, всё получилось. Больше всего провозился с моментом, который описан здесь. Потом всего лишь написал пробел в pro и стёр, после этого всё скомпилилось.

Кстати, прикольное западло из любопытства попробовал сделать - написать в коде интерфейса throw 0 , после этого дизайнер умирает при открытии )) Странно, что разработчики никак не защитились от этого

Ещё вопрос - при попытке перетащить виджет на форму один раз выскакивает окно с предупреждением, но русского текста не видно - что он там пишет

Цитата
???????????.......................???? <тут название моего плагина> ???????????????????????? <тут название моего класса>


это про что он там лопочет ?
igor_bogomolov
Цитата(Алексей1153 @ 30.1.2011, 17:19) *
Ещё вопрос - при попытке перетащить виджет на форму один раз выскакивает окно с предупреждением, но русского текста не видно - что он там пишет
Значит где то ты сделал ошибку. Из собственного опыта, это может быть несоответствие имени класса возвращаемой функцией QDesignerCustomWidgetInterface::name () и реально создаваемым виджетом из createWidget(). Или же возвращаешь ерунду в domXml().
Алексей1153
да, имя класса неправильное было. А насчёт domXml() - я возвращаю "" сейчас (но ругани на это нет). Щас гляну, что это )
igor_bogomolov
Цитата(Алексей1153 @ 30.1.2011, 17:51) *
А насчёт domXml() - я возвращаю ""
Так как раз таки можно. :) Эта функция нужна для более тонкой настройки виджета в дизайнере (как правило составных видетов).
igor_bogomolov
Я разделил тему.
Создание документации Qt
Алексей1153
а почему , если в Q_PROPERTY не задать опциональную секцию WRITE, то свойство не отображается в дизайнере ?
igor_bogomolov
Потому что не нужно оно там, раз его редактировать нельзя
Алексей1153
igor_bogomolov, а если это версия, к примеру ? И почему тогда WRITE - опциональный параметр ?
igor_bogomolov
Q_PROPERTY используется дизайнером, а не предназначен для него.
Не понимаю зачем нужно указывать версию для плагина дизайнера? Точно не уверен, но по моему ты все равно не подгрузишь несколько плагинов одного и того же виджета. Могу предложить, если это действительно нужно, зашивать версию в имя плагина.
Алексей1153
Цитата(igor_bogomolov @ 5.2.2011, 22:58) *
Не понимаю зачем нужно указывать версию для плагина дизайнера

по большому счёту незачем.
Алексей1153
а где можно почитать про назначение, содержимое и размещение файла *.pluginspec ? Поиском не нашёл - ни тут, ни в вики
igor_bogomolov
Writing the pluginspec file

Each plugin should accompany a pluginspec file that provides some metadata about the plugin. For our plugin the pluginspec file is as follows

    <plugin name="DoNothing" version="0.0.1" compatVersion="1.2.1">
        <vendor>VCreate Logic Pvt. Ltd.</vendor>
        <copyright>(C) 2008-2009 VCreate Logic Pvt. Ltd.</copyright>
        <license>Do anything you want</license>
        <description>A plugin that does nothing</description>
        <url>http://www.vcreatelogic.com</url>
        <dependencyList>
            <dependency name="Core" version="1.2.1"/>
       </dependencyList>
    </plugin>

The pluginspec file provides the following fields of information

1. Name of the plugin, which is also used as the name of the library file that provides the plugin implementation. (In our case DoNothing.dll on Windows, libDoNothing.so on Unix)
2. Version of the plugin
3. Required Qt Creator version
4. Vendor name
5. Copyright
6. License text
7. Description
8. URL of the plugin vendor
9. Dependency List ­ provides all the plugins that this plugin depends on. Qt Creator ensures that dependencies are loaded and initialized before this plugin.

Note: The pluginspec file should be in the same directory as the plugin's project file. Just to make things clear, the contents of the DoNothing plugin directory is as shown below
Алексей1153
благодарю. А откуда цитата, если не секрет ?
igor_bogomolov
Цитата(Алексей1153 @ 8.2.2011, 23:49) *
А откуда цитата, если не секрет ?
Ищи в google "Writing-Qt-Creator-Plugins.pdf"
Алексей1153
ага )
Вот ссылка. Не знаю, можно ли - почти везде, где находил доку, она была уже удалена
http://www.google.ru/url?sa=t&source=w...zWzxqRe2dgaDT1Q
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.