Russian Qt Forum
Ноябрь 21, 2024, 19:10
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Qt-инструментарий
>
[РЕШЕНО] Непонятная проблема с плагином для QtDesigner
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: [РЕШЕНО] Непонятная проблема с плагином для QtDesigner (Прочитано 11260 раз)
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
[РЕШЕНО] Непонятная проблема с плагином для QtDesigner
«
:
Апрель 24, 2019, 01:30 »
Поскольку это явно проблема с плагином, пишу сюда.
Был у меня свой плагин для дизайнера, я их вообще наделал уже кучу, не было проблем пока. В плагине инклюдился файл со структурами, то есть struct а не class. У одной из них был конструктор без параметров, который инициализировал поля структуры. Всё было хорошо, плагин загружался в дизайнер и работал. Теперь мне потребовалось чтобы эта структура стала QObject. Я сделал её классом, наследовал QObject, включил в начало макрос Q_OBJECT, выполнил qmake, конструктор сделал public, добавил ему параметр QObject* p=0, принял в нём этот параметр и передал в родительский QObject. Всё, как положено. Понаписал ещё всё что нужно было, пересобрал плагин, и бац... он перестал загружаться в дизайнер. В его списке загруженных плагинов написано что невозможно загрузить библиотеку из-за отсутствия символа _ZTV8myclassname - где myclassname имя этого класса.
В документации вроде бы нигде не сказано, что в плагине для дизайнера не могут быть несколько QObject - да и делал раньше с плагинам всё, что мне требовалось, всё было хорошо. _ZTV8myclassname - это вроде бы как конструктор. Но он вклассе есть. Долбаюсь полдня, пытаюсь понять что не так. Закомментировал в проблемном классе весь полезный код, все его поля. В конце концов добрался до следующего:
- в плагине нет ни одной ссылки на проблемный класс, кроме его объявления во включаемом файле - то есть, имя класса в коде плагина вообще нигде не встречается, только #include файла с этим классом
- если в этом классе есть конструктор - плагин не грузится
- если в этом классе нет конструктора - плагин грузится
- наличие деструктора не влияет
- вид конструктора не влияет - делал и без параметров как было сначала в структуре, делал и конструктор копирования, перебрал разные варианты
- без конструктора в класс можно включить любые другие функции - плагин с ними грузится, но если в коде плагина попытаться создать объект этого класса, плагин перестаёт грузиться с той же ошибкой
Проблема похоже специфичная для плагинов, может кто-то сталкивался или читал о похожем?
«
Последнее редактирование: Апрель 24, 2019, 23:39 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #1 :
Апрель 24, 2019, 04:59 »
Можно поковырять Link Map, а главное - убедиться что класс экспортируемый, напр
Код:
#pragma GCC visibility push(default)
myclass {
..
};
#pragma GCC visibility pop
На разных платформах синтаксис может быть разным, можно попробовать Q_DECL_EXPORT
Записан
ssoft
Программист
Offline
Сообщений: 584
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #2 :
Апрель 24, 2019, 08:23 »
Похоже, что дело под Windows, и что класс не экспортирован, поэтому и не линкуется. Q_DECL_EXPORT должен помочь.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #3 :
Апрель 24, 2019, 11:41 »
Цитата: ssoft от Апрель 24, 2019, 08:23
Похоже, что дело под Windows, и что класс не экспортирован, поэтому и не линкуется. Q_DECL_EXPORT должен помочь.
Linux Kubuntu. Зачем экспортировать класс, который используется только внутри плагина? Тем более... если вообще не используется. Ещё более не понятно, почему всё работало, пока класс был структурой.
«
Последнее редактирование: Апрель 24, 2019, 12:10 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #4 :
Апрель 24, 2019, 13:18 »
Не, нифига
class Q_DECL_EXPORT myclassname : public QObject
не помогает. Также как и #pragma GCC visibility push/pop
Всё та же фигня.
Записан
2^7-1 == 127, задумайтесь...
zhbr
Гость
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #5 :
Апрель 24, 2019, 14:24 »
а конструктор в public секции?
Записан
zhbr
Гость
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #6 :
Апрель 24, 2019, 14:26 »
Цитата: Гурман от Апрель 24, 2019, 11:41
Ещё более не понятно, почему всё работало, пока класс был структурой.
Помоему нынче классы и структуры отличаются только тем, что по умолчанию все поля и методы в классах private, а в структурах public
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #7 :
Апрель 24, 2019, 14:46 »
Цитата: zhbr от Апрель 24, 2019, 14:24
а конструктор в public секции?
Ессно.
Цитата: zhbr от Апрель 24, 2019, 14:26
Помоему нынче классы и структуры отличаются только тем, что по умолчанию все поля и методы в классах private, а в структурах public
Дык отож! Но это может быть связано с наследованием от QObject - у структуры его не было.
Некогда время терять - надо соображать обходной путь, иначе собрал бы обрезанный проект и выложил. Может потом, когда устану.
Кстати, этот же класс нужен ещё в совсем другом плагине, попробовал собрать его с этим классом - та же фигня. Плагин тоже перестал загружаться в дизайнер.
«
Последнее редактирование: Апрель 24, 2019, 14:49 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #8 :
Апрель 24, 2019, 14:55 »
_ZTV это таблица виртуальных методов.
Попробуйте полностью пересобрать проект: удалить все файлы сборки, а дальше qmake && make.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #9 :
Апрель 24, 2019, 17:07 »
Цитата: Old от Апрель 24, 2019, 14:55
_ZTV это таблица виртуальных методов.
Попробуйте полностью пересобрать проект: удалить все файлы сборки, а дальше qmake && make.
Я это в первую очередь делал. И потом ещё несколько раз. В таблице виртуальных методов _ZTV8myclassname - конструктор.
Записан
2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #10 :
Апрель 24, 2019, 17:17 »
Цитата: Гурман от Апрель 24, 2019, 17:07
В таблице виртуальных методов _ZTV8myclassname - конструктор.
Нет, в C++ не бывает виртуальных конструкторов, его не может быть в VMT. Это символ самой таблицы. Почему она не добавляется в библиотеку - вопрос. А в объектном файле этого класса такой символ есть?
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #11 :
Апрель 24, 2019, 17:43 »
Цитата: Old от Апрель 24, 2019, 17:17
А в объектном файле этого класса такой символ есть?
В дампе объектного модуля .o - да, есть. Причём именно в виде _ZTV8myclassname.
Записан
2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #12 :
Апрель 24, 2019, 17:45 »
Цитата: Гурман от Апрель 24, 2019, 17:43
В дампе объектного модуля .o - да, есть. Причём именно в виде _ZTV8myclassname.
Осталось понять почему линкер ее выбрасывает.
Попробуйте добавить виртуальный деструктор с пустым телом.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #13 :
Апрель 24, 2019, 19:25 »
Цитата: Old от Апрель 24, 2019, 17:45
Осталось понять почему линкер ее выбрасывает.
Попробуйте добавить виртуальный деструктор с пустым телом.
Нет, не помогает. Равно как и добавление dummy виртуальной функции, и переопределение виртуальных методов QObject. Мне кажется это косяк не линкера, а загрузчика плагинов Qt5, который используется в дизайнере. В Qt4 был другой загрузчик, я там делал гораздо сложнее вещи - и не было таких проблем.
Почти наверняка проблема с загрузчиком - в дампе .so плагина имя _ZTV8myclassname присутствует, то есть линкер его не выкинул.
«
Последнее редактирование: Апрель 24, 2019, 19:27 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Непонятная проблема с плагином для QtDesigner
«
Ответ #14 :
Апрель 24, 2019, 19:36 »
Цитата: Гурман от Апрель 24, 2019, 19:25
Мне кажется это косяк не линкера, а загрузчика плагинов Qt5, который используется в дизайнере.
Плагины это обычные динамические библиотеки и загружаются они системным загрузчиком ld, это его ошибка о неизвестном символе.
А не может быть дублирования символов? Не может такого быть, что в плагинах загруженных ранее есть класс с таким же именем?
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...