Russian Qt Forum

Qt => Общие вопросы => Тема начата: Igors от Июнь 02, 2014, 11:00



Название: Плагины приложения
Отправлено: Igors от Июнь 02, 2014, 11:00
Добрый день

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

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

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

Спасибо

 


Название: Re: Плагины приложения
Отправлено: GreatSnake от Июнь 02, 2014, 11:03
Линковать плагины с Qt libs.


Название: Re: Плагины приложения
Отправлено: Igors от Июнь 02, 2014, 11:10
Линковать плагины с Qt libs.
А каким образом? Статычно нереально, плагинов под сотню. Динамически - а откуда взять путь? Или "Qt libs" - это нечто другое ??? И меня смущает - напр qApp как плагин узнает что это именно qApp хоста?


Название: Re: Плагины приложения
Отправлено: GreatSnake от Июнь 02, 2014, 11:20
Статычно нереально, плагинов под сотню.
Не то что нереально, а непозволительно, т.к. получишь двойную инициализацию static переменных в либах.

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

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


Название: Re: Плагины приложения
Отправлено: Igors от Июнь 02, 2014, 11:42
Оттуда же, откуда берётся для самого приложения и других либс.
Верно ли я Вас понял что путь должен быть строго один для хоста и всех плагинов, напр прописан в path или переменной окружения?

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


Название: Re: Плагины приложения
Отправлено: GreatSnake от Июнь 02, 2014, 11:48
Чтобы использовать в плагине классы определённой библиотеки, нужно этот плагин слинковать с этой библиотекой. Это же очевидно)
Если плагин использует те же библиотеки что и приложение, никаких дополнительных проблем с инсталлом и запуском быть не должно.


Название: Re: Плагины приложения
Отправлено: Old от Июнь 02, 2014, 11:49
Если хост использует библиотеки Qt, то плагин будет использовать их, они уже будут загружены в память процесса. Без этого хост даже не стартанет.


Название: Re: Плагины приложения
Отправлено: Igors от Июнь 02, 2014, 12:53
Чтобы использовать в плагине классы определённой библиотеки, нужно этот плагин слинковать с этой библиотекой. Это же очевидно)
Если плагин использует те же библиотеки что и приложение, никаких дополнительных проблем с инсталлом и запуском быть не должно.
Если хост использует библиотеки Qt, то плагин будет использовать их, они уже будут загружены в память процесса. Без этого хост даже не стартанет.
Само собой, но как сказать/обеспечить чтобы плагин грузил "те самые" Qt либы, что уже загрузил хост?


Название: Re: Плагины приложения
Отправлено: Old от Июнь 02, 2014, 12:59
Линковать плагин с библиотеками Qt. Если хост использует 4 версию, то и плагин нужно линковать с 4, если 5, то с пятеркой. ABI у них стабильны для каждой версии.


Название: Re: Плагины приложения
Отправлено: Igors от Июнь 03, 2014, 10:53
Ага, дошло. Если плагин и хост слинкованы с теми же либами, то при загрузке плагина ОС вообще ничего не будет искать на диске - он подсунет плагину то что уже загружено хостом. Во всяком случае - должен.

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


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

Цитировать
Можно ли как-то указать плагину напр "устраивает 4.7 и выше"?
Такой возможности нет по определению.


Название: Re: Плагины приложения
Отправлено: gil9red от Июнь 03, 2014, 11:18
Поэтому есть правило: и само приложение и все плагины должны линковаться с одними и теме-же библиотеками.

И одним компилятором одинаковой версии, иначе может случиться бинарная несовместимость :)


Название: Re: Плагины приложения
Отправлено: Igors от Июнь 04, 2014, 08:47
Qt 5 и Qt 4 не совместимы. Такой плагин работать не будет.
Ну 4/5 как-то пережить можно. Но какие-то классы/ф-ции Qt отмирают в след версии, напр в 4.8 чего-то уже нет что есть в 4.7. Выходит версия должна точно совпадать или как?

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


Название: Re: Плагины приложения
Отправлено: Old от Июнь 04, 2014, 09:44
Но какие-то классы/ф-ции Qt отмирают в след версии, напр в 4.8 чего-то уже нет что есть в 4.7.
Нет. Такого не может быть.
Я уже писал, ABI в Qt стабильно для каждой мажорной версии.

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


Название: Re: Плагины приложения
Отправлено: Igors от Июнь 04, 2014, 10:11
Хорошо, а вот когда-то (еще на PowerPC) линковал так: хост экспортирует ф-ции, а плагин использует lib в которой эти же ф-ции и указаны. Т.е. для плагина либа - сам хост. Можно ли сейчас так делать?


Название: Re: Плагины приложения
Отправлено: Old от Июнь 04, 2014, 10:16
В linux можно, в венде - нет.