Russian Qt Forum
Ноябрь 21, 2024, 19:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Непонятная проблема с плагином для QtDesigner  (Прочитано 11269 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Апрель 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 Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Апрель 24, 2019, 04:59 »

Можно поковырять Link Map, а главное - убедиться что класс экспортируемый, напр
Код:
#pragma GCC visibility push(default)

myclass {
..
};

#pragma GCC visibility pop
На разных платформах синтаксис может быть разным, можно попробовать Q_DECL_EXPORT
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #2 : Апрель 24, 2019, 08:23 »

Похоже, что дело под Windows, и что класс не экспортирован, поэтому и не линкуется. Q_DECL_EXPORT должен помочь.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #3 : Апрель 24, 2019, 11:41 »

Похоже, что дело под Windows, и что класс не экспортирован, поэтому и не линкуется. Q_DECL_EXPORT должен помочь.
Linux Kubuntu. Зачем экспортировать класс, который используется только внутри плагина? Тем более... если вообще не используется. Ещё более не понятно, почему всё работало, пока класс был структурой.
« Последнее редактирование: Апрель 24, 2019, 12:10 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Апрель 24, 2019, 13:18 »

Не, нифига

class Q_DECL_EXPORT myclassname : public QObject

не помогает. Также как и #pragma GCC visibility push/pop

Всё та же фигня.  Злой
Записан

2^7-1 == 127, задумайтесь...
zhbr
Гость
« Ответ #5 : Апрель 24, 2019, 14:24 »

а конструктор в public секции?
Записан
zhbr
Гость
« Ответ #6 : Апрель 24, 2019, 14:26 »

Ещё более не понятно, почему всё работало, пока класс был структурой.
Помоему нынче классы и структуры отличаются только тем, что по умолчанию все поля и методы в классах private, а в структурах public
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #7 : Апрель 24, 2019, 14:46 »

а конструктор в public секции?
Ессно.

Помоему нынче классы и структуры отличаются только тем, что по умолчанию все поля и методы в классах private, а в структурах public
Дык отож! Но это может быть связано с наследованием от QObject - у структуры его не было.

Некогда время терять - надо соображать обходной путь, иначе собрал бы обрезанный проект и выложил. Может потом, когда устану.

Кстати, этот же класс нужен ещё в совсем другом плагине, попробовал собрать его с этим классом - та же фигня. Плагин тоже перестал загружаться в дизайнер.
« Последнее редактирование: Апрель 24, 2019, 14:49 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Апрель 24, 2019, 14:55 »

_ZTV это таблица виртуальных методов.
Попробуйте полностью пересобрать проект: удалить все файлы сборки, а дальше qmake && make.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #9 : Апрель 24, 2019, 17:07 »

_ZTV это таблица виртуальных методов.
Попробуйте полностью пересобрать проект: удалить все файлы сборки, а дальше qmake && make.
Я это в первую очередь делал. И потом ещё несколько раз. В таблице виртуальных методов _ZTV8myclassname - конструктор.

Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Апрель 24, 2019, 17:17 »

В таблице виртуальных методов _ZTV8myclassname - конструктор.
Нет, в C++ не бывает виртуальных конструкторов, его не может быть в VMT. Это символ самой таблицы. Почему она не добавляется в библиотеку - вопрос. А в объектном файле этого класса такой символ есть?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #11 : Апрель 24, 2019, 17:43 »

А в объектном файле этого класса такой символ есть?

В дампе объектного модуля .o - да, есть. Причём именно в виде _ZTV8myclassname.
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Апрель 24, 2019, 17:45 »

В дампе объектного модуля .o - да, есть. Причём именно в виде _ZTV8myclassname.
Осталось понять почему линкер ее выбрасывает. Улыбающийся
Попробуйте добавить виртуальный деструктор с пустым телом.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #13 : Апрель 24, 2019, 19:25 »

Осталось понять почему линкер ее выбрасывает. Улыбающийся
Попробуйте добавить виртуальный деструктор с пустым телом.

Нет, не помогает. Равно как и добавление dummy виртуальной функции, и переопределение виртуальных методов QObject. Мне кажется это косяк не линкера, а загрузчика плагинов Qt5, который используется в дизайнере. В Qt4 был другой загрузчик, я там делал гораздо сложнее вещи - и не было таких проблем.

Почти наверняка проблема с загрузчиком - в дампе .so плагина имя _ZTV8myclassname присутствует, то есть линкер его не выкинул.
« Последнее редактирование: Апрель 24, 2019, 19:27 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Апрель 24, 2019, 19:36 »

Мне кажется это косяк не линкера, а загрузчика плагинов Qt5, который используется в дизайнере.
Плагины это обычные динамические библиотеки и загружаются они системным загрузчиком ld, это его ошибка о неизвестном символе.

А не может быть дублирования символов? Не может такого быть, что в плагинах загруженных ранее есть класс с таким же именем?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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