Russian Qt Forum
Ноябрь 24, 2024, 08:23
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Плагины приложения
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Плагины приложения (Прочитано 7423 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Плагины приложения
«
:
Июнь 02, 2014, 11:00 »
Добрый день
Наверняка наивный вопрос, никогда еще с этим не сталкивался, ну все когда-то происходит впервые. Есть приложение имеющее плагины. Сейчас заканчивается его портирование на Qt. Все плагины продолжают работать, от имеющихся больше ничего не требуется.
Вопрос как дать новым плагинам возможность использовать Qt сохранив при этом старое API? Сейчас приложение незатейливо загружает плагины LoadLibrary, находит экспорты плагина через GetProcAddress (dlsym) и вызывает их. Плагин таким же образом извлекает ф-ции хоста - вот и все взаимодействие. Как сделать чтобы плагин мог свободно использовать qApp, QString, создавать окна и.т.д?
По существу вопрос - как плагину подгрузить именно те либы что юзает хост? По-другому все равно не выходит т.к. плагин может находиться в любом фолдере, приложение может копироваться со всеми плагинами и.т.п. Пробовал читать, но впечатление что попадаю не туда - описываются расширения для самого Qt а мне это совсем не нужно. Просветите.
Спасибо
Записан
GreatSnake
Джедай : наставник для всех
Offline
Сообщений: 2921
Re: Плагины приложения
«
Ответ #1 :
Июнь 02, 2014, 11:03 »
Линковать плагины с Qt libs.
Записан
Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Плагины приложения
«
Ответ #2 :
Июнь 02, 2014, 11:10 »
Цитата: GreatSnake от Июнь 02, 2014, 11:03
Линковать плагины с Qt libs.
А каким образом? Статычно нереально, плагинов под сотню. Динамически - а откуда взять путь? Или "Qt libs" - это нечто другое
И меня смущает - напр qApp как плагин узнает что это именно qApp хоста?
Записан
GreatSnake
Джедай : наставник для всех
Offline
Сообщений: 2921
Re: Плагины приложения
«
Ответ #3 :
Июнь 02, 2014, 11:20 »
Цитата: Igors от Июнь 02, 2014, 11:10
Статычно нереально, плагинов под сотню.
Не то что нереально, а непозволительно, т.к. получишь двойную инициализацию static переменных в либах.
Цитировать
Динамически - а откуда взять путь?
Оттуда же, откуда берётся для самого приложения и других либс.
Цитировать
И меня смущает - напр qApp как плагин узнает что это именно qApp хоста?
Хм.. причём здесь "хост"
Плагин - это обычная динамическая библиотека, только опциональная.
Записан
Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Плагины приложения
«
Ответ #4 :
Июнь 02, 2014, 11:42 »
Цитата: GreatSnake от Июнь 02, 2014, 11:20
Оттуда же, откуда берётся для самого приложения и других либс.
Верно ли я Вас понял что путь должен быть строго один для хоста и всех плагинов, напр прописан в path или переменной окружения?
Мне кажется это создает доп проблемы с инсталлом. Хорошо, а можно ли так: когда хост грузит плагин, создает для него этот путь (переменную окуружения)?
Записан
GreatSnake
Джедай : наставник для всех
Offline
Сообщений: 2921
Re: Плагины приложения
«
Ответ #5 :
Июнь 02, 2014, 11:48 »
Чтобы использовать в плагине классы определённой библиотеки, нужно этот плагин слинковать с этой библиотекой. Это же очевидно)
Если плагин использует те же библиотеки что и приложение, никаких дополнительных проблем с инсталлом и запуском быть не должно.
Записан
Qt 5.11/4.8.7 (X11/Win)
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Плагины приложения
«
Ответ #6 :
Июнь 02, 2014, 11:49 »
Если хост использует библиотеки Qt, то плагин будет использовать их, они уже будут загружены в память процесса. Без этого хост даже не стартанет.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Плагины приложения
«
Ответ #7 :
Июнь 02, 2014, 12:53 »
Цитата: GreatSnake от Июнь 02, 2014, 11:48
Чтобы использовать в плагине классы определённой библиотеки, нужно этот плагин слинковать с этой библиотекой. Это же очевидно)
Если плагин использует те же библиотеки что и приложение, никаких дополнительных проблем с инсталлом и запуском быть не должно.
Цитата: Old от Июнь 02, 2014, 11:49
Если хост использует библиотеки Qt, то плагин будет использовать их, они уже будут загружены в память процесса. Без этого хост даже не стартанет.
Само собой, но как сказать/обеспечить чтобы плагин грузил "те самые" Qt либы, что уже загрузил хост?
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Плагины приложения
«
Ответ #8 :
Июнь 02, 2014, 12:59 »
Линковать плагин с библиотеками Qt. Если хост использует 4 версию, то и плагин нужно линковать с 4, если 5, то с пятеркой. ABI у них стабильны для каждой версии.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Плагины приложения
«
Ответ #9 :
Июнь 03, 2014, 10:53 »
Ага, дошло. Если плагин и хост слинкованы с теми же либами, то при загрузке плагина ОС вообще ничего не будет искать на диске - он подсунет плагину то что уже загружено хостом. Во всяком случае - должен.
Хорошо, а если "не с теми же"? Напр в след версии хост использует Qt 5,x.x, а плагин все еще Qt 4.7? Рекомендация "пересобрать плагины" понятна, но болезненна. Можно ли как-то указать плагину напр "устраивает 4.7 и выше"?
Записан
GreatSnake
Джедай : наставник для всех
Offline
Сообщений: 2921
Re: Плагины приложения
«
Ответ #10 :
Июнь 03, 2014, 11:04 »
Цитата: Igors от Июнь 03, 2014, 10:53
Хорошо, а если "не с теми же"? Напр в след версии хост использует 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
Сообщений: 1805
Re: Плагины приложения
«
Ответ #11 :
Июнь 03, 2014, 11:18 »
Цитата: GreatSnake от Июнь 03, 2014, 11:04
Поэтому есть правило: и само приложение и все плагины должны линковаться с одними и теме-же библиотеками.
И одним компилятором одинаковой версии, иначе может случиться бинарная несовместимость
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Плагины приложения
«
Ответ #12 :
Июнь 04, 2014, 08:47 »
Цитата: GreatSnake от Июнь 03, 2014, 11:04
Qt 5 и Qt 4 не совместимы. Такой плагин работать не будет.
Ну 4/5 как-то пережить можно. Но какие-то классы/ф-ции Qt отмирают в след версии, напр в 4.8 чего-то уже нет что есть в 4.7. Выходит версия должна точно совпадать или как?
Еще подобный вопрос: если хост слинкован с Qt статически - то все, глухо? Ну ясно всегда есть возможность выдергивать экспорт ф-ции явно, но при огромном кол-ве это нереально.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Плагины приложения
«
Ответ #13 :
Июнь 04, 2014, 09:44 »
Цитата: Igors от Июнь 04, 2014, 08:47
Но какие-то классы/ф-ции Qt отмирают в след версии, напр в 4.8 чего-то уже нет что есть в 4.7.
Нет. Такого не может быть.
Я уже писал, ABI в Qt стабильно для каждой мажорной версии.
Цитата: Igors от Июнь 04, 2014, 08:47
Еще подобный вопрос: если хост слинкован с Qt статически - то все, глухо?
Да.
В общем случае, библиотеки хоста никак не связаны с библиотеками плагина. Но в случае с Qt могут быть проблемы из-за статических переменных.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Плагины приложения
«
Ответ #14 :
Июнь 04, 2014, 10:11 »
Хорошо, а вот когда-то (еще на PowerPC) линковал так: хост экспортирует ф-ции, а плагин использует lib в которой эти же ф-ции и указаны. Т.е. для плагина либа - сам хост. Можно ли сейчас так делать?
Записан
Страниц: [
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...