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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Плагины приложения  (Прочитано 7425 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июнь 02, 2014, 11:00 »

Добрый день

Наверняка наивный вопрос, никогда еще с этим не сталкивался, ну все когда-то происходит впервые. Есть приложение имеющее плагины. Сейчас заканчивается его портирование на Qt. Все плагины продолжают работать, от имеющихся больше ничего не требуется.

Вопрос как дать новым плагинам возможность использовать Qt сохранив при этом старое API? Сейчас приложение незатейливо загружает плагины LoadLibrary, находит экспорты плагина через GetProcAddress (dlsym) и вызывает их. Плагин таким же образом извлекает ф-ции хоста - вот и все взаимодействие. Как сделать чтобы плагин мог свободно использовать qApp, QString, создавать окна и.т.д?

По существу вопрос - как плагину подгрузить именно те либы что юзает хост? По-другому все равно не выходит т.к. плагин может находиться в любом фолдере, приложение может копироваться со всеми плагинами и.т.п. Пробовал читать, но впечатление что попадаю не туда - описываются расширения для самого Qt а мне это совсем не нужно. Просветите.

Спасибо

 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Июнь 02, 2014, 11:03 »

Линковать плагины с Qt libs.
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июнь 02, 2014, 11:10 »

Линковать плагины с Qt libs.
А каким образом? Статычно нереально, плагинов под сотню. Динамически - а откуда взять путь? Или "Qt libs" - это нечто другое Непонимающий И меня смущает - напр qApp как плагин узнает что это именно qApp хоста?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Июнь 02, 2014, 11:20 »

Статычно нереально, плагинов под сотню.
Не то что нереально, а непозволительно, т.к. получишь двойную инициализацию static переменных в либах.

Цитировать
Динамически - а откуда взять путь?
Оттуда же, откуда берётся для самого приложения и других либс.

Цитировать
И меня смущает - напр qApp как плагин узнает что это именно qApp хоста?
Хм.. причём здесь "хост" Непонимающий
Плагин - это обычная динамическая библиотека, только опциональная.
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июнь 02, 2014, 11:42 »

Оттуда же, откуда берётся для самого приложения и других либс.
Верно ли я Вас понял что путь должен быть строго один для хоста и всех плагинов, напр прописан в path или переменной окружения?

Мне кажется это создает доп проблемы с инсталлом. Хорошо, а можно ли так: когда хост грузит плагин, создает для него этот путь (переменную окуружения)?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Июнь 02, 2014, 11:48 »

Чтобы использовать в плагине классы определённой библиотеки, нужно этот плагин слинковать с этой библиотекой. Это же очевидно)
Если плагин использует те же библиотеки что и приложение, никаких дополнительных проблем с инсталлом и запуском быть не должно.
Записан

Qt 5.11/4.8.7 (X11/Win)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Июнь 02, 2014, 11:49 »

Если хост использует библиотеки Qt, то плагин будет использовать их, они уже будут загружены в память процесса. Без этого хост даже не стартанет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июнь 02, 2014, 12:53 »

Чтобы использовать в плагине классы определённой библиотеки, нужно этот плагин слинковать с этой библиотекой. Это же очевидно)
Если плагин использует те же библиотеки что и приложение, никаких дополнительных проблем с инсталлом и запуском быть не должно.
Если хост использует библиотеки Qt, то плагин будет использовать их, они уже будут загружены в память процесса. Без этого хост даже не стартанет.
Само собой, но как сказать/обеспечить чтобы плагин грузил "те самые" Qt либы, что уже загрузил хост?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Июнь 02, 2014, 12:59 »

Линковать плагин с библиотеками Qt. Если хост использует 4 версию, то и плагин нужно линковать с 4, если 5, то с пятеркой. ABI у них стабильны для каждой версии.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Июнь 03, 2014, 10:53 »

Ага, дошло. Если плагин и хост слинкованы с теми же либами, то при загрузке плагина ОС вообще ничего не будет искать на диске - он подсунет плагину то что уже загружено хостом. Во всяком случае - должен.

Хорошо, а если "не с теми же"? Напр в след версии хост использует Qt 5,x.x, а плагин все еще Qt 4.7? Рекомендация "пересобрать плагины" понятна, но болезненна. Можно ли как-то указать плагину напр "устраивает 4.7 и выше"?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Июнь 03, 2014, 11:04 »

Хорошо, а если "не с теми же"? Напр в след версии хост использует Qt 5,x.x, а плагин все еще Qt 4.7? Рекомендация "пересобрать плагины" понятна, но болезненна.
Qt 5 и Qt 4 не совместимы. Такой плагин работать не будет.
Плагин является подгружаемой частью приложения. На момент его подгрузки делается проверка зависимых библиотек и резолвинг символов.
После загрузки такой плагин становится частью приложения. Ну и как в одном приложении могут одновременно использоваться несколько версий библиотек?
Проблемы могут быть даже в случае совпадения версий библиотек, но собранных по-разному.
Поэтому есть правило: и само приложение и все плагины должны линковаться с одними и теме-же библиотеками.

Цитировать
Можно ли как-то указать плагину напр "устраивает 4.7 и выше"?
Такой возможности нет по определению.
« Последнее редактирование: Июнь 03, 2014, 11:06 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #11 : Июнь 03, 2014, 11:18 »

Поэтому есть правило: и само приложение и все плагины должны линковаться с одними и теме-же библиотеками.

И одним компилятором одинаковой версии, иначе может случиться бинарная несовместимость Улыбающийся
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Июнь 04, 2014, 08:47 »

Qt 5 и Qt 4 не совместимы. Такой плагин работать не будет.
Ну 4/5 как-то пережить можно. Но какие-то классы/ф-ции Qt отмирают в след версии, напр в 4.8 чего-то уже нет что есть в 4.7. Выходит версия должна точно совпадать или как?

Еще подобный вопрос: если хост слинкован с Qt статически - то все, глухо? Ну ясно всегда есть возможность выдергивать экспорт ф-ции явно, но при огромном кол-ве это нереально.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Июнь 04, 2014, 09:44 »

Но какие-то классы/ф-ции Qt отмирают в след версии, напр в 4.8 чего-то уже нет что есть в 4.7.
Нет. Такого не может быть.
Я уже писал, ABI в Qt стабильно для каждой мажорной версии.

Еще подобный вопрос: если хост слинкован с Qt статически - то все, глухо?
Да.
В общем случае, библиотеки хоста никак не связаны с библиотеками плагина. Но в случае с Qt могут быть проблемы из-за статических переменных.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Июнь 04, 2014, 10:11 »

Хорошо, а вот когда-то (еще на PowerPC) линковал так: хост экспортирует ф-ции, а плагин использует lib в которой эти же ф-ции и указаны. Т.е. для плагина либа - сам хост. Можно ли сейчас так делать?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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