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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Собрать все dll-ки в папку и пользоваться оттуда.  (Прочитано 8792 раз)
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
« Последнее редактирование: Апрель 30, 2015, 23:11 от neosapient » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Апрель 30, 2015, 23:28 »

Посмотри как сделано в сорцах QtCreator и сделай по-аналогии + прикрути любой инсталлятор (например WIX).
Записан

ArchLinux x86_64 / Win10 64 bit
neosapient
Гость
« Ответ #2 : Апрель 30, 2015, 23:44 »

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

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

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

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Май 01, 2015, 00:08 »

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

Заупскай батником как ты и хотел, а exe тоже спрячь в подпапку, например в bin/
Записан
Bepec
Гость
« Ответ #4 : Май 01, 2015, 00:14 »

Чтобы екзешник искал в других папках - это надо ОС трогать, а не екзешник. Пока приложенька не загрузится со всеми дллляхами, именно ОС руководит процессом.

Другой вопрос, можно ли прописать пути для поиска в екзехе, но я о таком не слышал. Поройтесь, мб и достанете что нибудь на свежий воздух )
Записан
neosapient
Гость
« Ответ #5 : Май 01, 2015, 00:33 »

Bepec, а как происходит подгрузка sqldrivers и imageformats?
Вероятно, там не статическая, а динамическая загрузка библиотек?
Записан
neosapient
Гость
« Ответ #6 : Май 01, 2015, 00:59 »

В порядке бреда. (bat файл не хочется)
Допустим я всё своё приложение запихну в ещё один dll-костыль.

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

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

P.S.
Понимаю, что извращение ) Будем считать гимнастикой для ума.
Записан
Bepec
Гость
« Ответ #7 : Май 01, 2015, 01:51 »

Посчитай сколько бреда будет в середине и в конце этой авантюры Веселый

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

to neosapient - динамику можно указать в путях qt-conf.ini. И да, там так же можно указать путь для binaries, но подгрузка ini осуществляется уже после загрузки приложения Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Май 01, 2015, 08:55 »

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

По поводу "батничков" - ну это как бы приложение еще до запуска заявляет "я мелкое чмо" Улыбающийся И обсуждения не заслуживает
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Май 01, 2015, 09:14 »

По поводу "батничков" - ну это как бы приложение еще до запуска заявляет "я мелкое чмо" Улыбающийся И обсуждения не заслуживает
Очередной бред.  Строит глазки
Скорее отсутствием "батничка" приложение заявляет "я мелкое чмо" и обсуждения не заслуживаю.
Крупные проекты, как правило, запускаются "батничками". На вскидку, тот-же qtcreator, такое "мелкое чмо" как kodi, google earth, "мелкота" virtualbox. Много такой "мелкоты" можно найти. Улыбающийся
« Последнее редактирование: Май 01, 2015, 09:20 от Old » Записан
Bepec
Гость
« Ответ #10 : Май 01, 2015, 09:15 »

Если беспокоит батник, напишите приложение Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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