Russian Qt Forum

Qt => Общие вопросы => Тема начата: neosapient от Апрель 30, 2015, 23:07



Название: Собрать все dll-ки в папку и пользоваться оттуда.
Отправлено: neosapient от Апрель 30, 2015, 23:07
Здравствуйте.

Периодически возвращаюсь к вопросу, как бы собрать все QT4/QT5 dll-ки в одну подпапку, чтобы работало по схеме:

Корневая папка
|
- программа.ехе
+ подпапка с QT
   |
   - QTCore.dll
   - QTGui.dll



Есть несколько подходов "в лоб", но они все не нравятся. Размышления:
0) Можно забыть о QT-dll-ках, и сделать QT библиотеки статическим. Но тогда компоненты, созданные на их основе, будут большого размера. В целях уменьшения размера отказываемся от статических библиотек.
1) Можно подгружать QT-dll-ки динамически. Но тогда потребуется вызывать каждую функцию в dll (сделать обертку над каждой экспортируемой функцией). Сколько таких оберток потребуется? несколько тысяч? Как то не хочется портить код программы, задействуя повсюду обертки.
2) Можно сохранить все QT-dll-ки куда-нибудь в Windows\System32. Тогда я смогу подгружать QT-dll-ки статически. Вроде бы всё хорошо. Но мой перфектционизм требует, чтобы я не засорял операционку разного рода dll. А вдруг есть ещё одна программа, которая использует иную версию QT? Всё таки лучше хранить dll-ки в папке программы. Но я не хочу мусорить, я хочу убрать dll-ки в подпапку, с глаз долой.
3) Допустим можно сделать bat-файл, который добавляет переменную PATH в пространство имен, и затем запускает мою программу. Теоретически должно сработать. Но попробуй объяснить пользователю, что надо щелкать не по exe-файлу, а по bat-файлу.
4) Тут я вспоминаю, что есть разного рода плагины для QT4, например, sqldrivers или imageformats. И лежат они в подпапках. Может можно пересобрать QT так, чтобы они лежали QT-dll-ки в какой-нибудь подпаке, и при старте, статическая загрузка этих QT-dll-ек искала их в подпапке? Есть ли мануал для подобной сборки?

P.S.
Почему, я задался этим вопросом сейчас. Пишу проект с множеством разных dll, как моих, так и чужих. Мои dll-ки будут работать с объектами из библиотеки QT4. Если все dll-ки собрать в один уровень с программой, то у меня возникнет Зоопарк. Хочу заранее навести порядок.

Корневая папка
|
- программа.ехе
+ подпапка с QT
   |
   - QTCore.dll
   - QTGui.dll
+ подпапка с моими dll, которые используют QT
   |
   - example1.dll
   - example2.dll


Название: Re: Собрать все dll-ки в папку и пользоваться оттуда.
Отправлено: kuzulis от Апрель 30, 2015, 23:28
Посмотри как сделано в сорцах QtCreator и сделай по-аналогии + прикрути любой инсталлятор (например WIX).


Название: Re: Собрать все dll-ки в папку и пользоваться оттуда.
Отправлено: neosapient от Апрель 30, 2015, 23:44
Посмотри как сделано в сорцах QtCreator и сделай по-аналогии + прикрути любой инсталлятор (например WIX).
У меня файл qtcreator.exe лежит в папке C:\Qt5\Tools\QtCreator\bin.
В этой же папке лежат Qt5Core.dll, Qt5Gui.dll и весь остальной пакет стандартных dll-ек.

А мне хочется собрать все dll-ки в отдельную подпапку. И чтобы при запуске программы, статической подгружались qt-шные библиотеки из этой подпапки, а не с основного уровня программы.



Название: Re: Собрать все dll-ки в папку и пользоваться оттуда.
Отправлено: Alex Custov от Май 01, 2015, 00:08
А мне хочется собрать все dll-ки в отдельную подпапку. И чтобы при запуске программы, статической подгружались qt-шные библиотеки из этой подпапки, а не с основного уровня программы.

Заупскай батником как ты и хотел, а exe тоже спрячь в подпапку, например в bin/


Название: Re: Собрать все dll-ки в папку и пользоваться оттуда.
Отправлено: Bepec от Май 01, 2015, 00:14
Чтобы екзешник искал в других папках - это надо ОС трогать, а не екзешник. Пока приложенька не загрузится со всеми дллляхами, именно ОС руководит процессом.

Другой вопрос, можно ли прописать пути для поиска в екзехе, но я о таком не слышал. Поройтесь, мб и достанете что нибудь на свежий воздух )


Название: Re: Собрать все dll-ки в папку и пользоваться оттуда.
Отправлено: neosapient от Май 01, 2015, 00:33
Bepec, а как происходит подгрузка sqldrivers и imageformats?
Вероятно, там не статическая, а динамическая загрузка библиотек?


Название: Re: Собрать все dll-ки в папку и пользоваться оттуда.
Отправлено: neosapient от Май 01, 2015, 00:59
В порядке бреда. (bat файл не хочется)
Допустим я всё своё приложение запихну в ещё один dll-костыль.

Делаю простую программу, которая:
- расширяет область видимости %PATH%
- загружает dll-костыль, который при старте статически загрузит QT-dll-ки, ведь область видимости %PATH% уже расширена.

Остается вопрос, как программа может расширить собственный %PATH%, выданный ей при запуске? Какие функции следует использовать?

P.S.
Понимаю, что извращение ) Будем считать гимнастикой для ума.


Название: Re: Собрать все dll-ки в папку и пользоваться оттуда.
Отправлено: Bepec от Май 01, 2015, 01:51
Посчитай сколько бреда будет в середине и в конце этой авантюры :D

Bat файл самый нормальный вариант. Тем более его сочетание и твоё даёт больший простор. Ведь в бат файле можно расширить область видимости path отдельно для этой сессии и потом запускать файл. Хотя это надо пробовать и смотреть что получится. Но в теории должно сработать.

to neosapient - динамику можно указать в путях qt-conf.ini. И да, там так же можно указать путь для binaries, но подгрузка ini осуществляется уже после загрузки приложения :D


Название: Re: Собрать все dll-ки в папку и пользоваться оттуда.
Отправлено: Igors от Май 01, 2015, 08:55
Поставить опцию линковки weak (в MSVC это соответствует "Delay Loaded DLLs"). Когда приложение стартанет (без поиска dll) сделать руками все LoadLibrary. Все Qt либы могут быть так слинкованы, проверял. Но тут есть ограничение - нельзя объявлять глобальные переменные как Qt классы, напр
Код
C++ (Qt)
QString theVar("text");  // конструктор должен быть вызван до main - все, не слинкует weak
 
Это я полностью побороть не смог (уж очень много было переделывать). Поэтому QtCore пришлось оставить "рядом с exe-шкой". Зато с десяток остальных спрятал.

По поводу "батничков" - ну это как бы приложение еще до запуска заявляет "я мелкое чмо" :) И обсуждения не заслуживает


Название: Re: Собрать все dll-ки в папку и пользоваться оттуда.
Отправлено: Old от Май 01, 2015, 09:14
По поводу "батничков" - ну это как бы приложение еще до запуска заявляет "я мелкое чмо" :) И обсуждения не заслуживает
Очередной бред.  ::)
Скорее отсутствием "батничка" приложение заявляет "я мелкое чмо" и обсуждения не заслуживаю.
Крупные проекты, как правило, запускаются "батничками". На вскидку, тот-же qtcreator, такое "мелкое чмо" как kodi, google earth, "мелкота" virtualbox. Много такой "мелкоты" можно найти. :)


Название: Re: Собрать все dll-ки в папку и пользоваться оттуда.
Отправлено: Bepec от Май 01, 2015, 09:15
Если беспокоит батник, напишите приложение :D