Russian Qt Forum
Ноябрь 24, 2024, 09:00
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Собрать все dll-ки в папку и пользоваться оттуда.
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Собрать все dll-ки в папку и пользоваться оттуда. (Прочитано 8781 раз)
neosapient
Гость
Собрать все dll-ки в папку и пользоваться оттуда.
«
:
Апрель 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
Сообщений: 2812
Re: Собрать все dll-ки в папку и пользоваться оттуда.
«
Ответ #1 :
Апрель 30, 2015, 23:28 »
Посмотри как сделано в сорцах QtCreator и сделай по-аналогии + прикрути любой инсталлятор (например WIX).
Записан
ArchLinux x86_64 / Win10 64 bit
neosapient
Гость
Re: Собрать все dll-ки в папку и пользоваться оттуда.
«
Ответ #2 :
Апрель 30, 2015, 23:44 »
Цитата: kuzulis от Апрель 30, 2015, 23:28
Посмотри как сделано в сорцах QtCreator и сделай по-аналогии + прикрути любой инсталлятор (например WIX).
У меня файл qtcreator.exe лежит в папке C:\Qt5\Tools\QtCreator\bin.
В этой же папке лежат Qt5Core.dll, Qt5Gui.dll и весь остальной пакет стандартных dll-ек.
А мне хочется собрать все dll-ки в отдельную подпапку. И чтобы при запуске программы, статической подгружались qt-шные библиотеки из этой подпапки, а не с основного уровня программы.
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: Собрать все dll-ки в папку и пользоваться оттуда.
«
Ответ #3 :
Май 01, 2015, 00:08 »
Цитата: neosapient от Апрель 30, 2015, 23:44
А мне хочется собрать все dll-ки в отдельную подпапку. И чтобы при запуске программы, статической подгружались qt-шные библиотеки из этой подпапки, а не с основного уровня программы.
Заупскай батником как ты и хотел, а exe тоже спрячь в подпапку, например в bin/
Записан
Bepec
Гость
Re: Собрать все dll-ки в папку и пользоваться оттуда.
«
Ответ #4 :
Май 01, 2015, 00:14 »
Чтобы екзешник искал в других папках - это надо ОС трогать, а не екзешник. Пока приложенька не загрузится со всеми дллляхами, именно ОС руководит процессом.
Другой вопрос, можно ли прописать пути для поиска в екзехе, но я о таком не слышал. Поройтесь, мб и достанете что нибудь на свежий воздух )
Записан
neosapient
Гость
Re: Собрать все dll-ки в папку и пользоваться оттуда.
«
Ответ #5 :
Май 01, 2015, 00:33 »
Bepec, а как происходит подгрузка sqldrivers и imageformats?
Вероятно, там не статическая, а динамическая загрузка библиотек?
Записан
neosapient
Гость
Re: Собрать все dll-ки в папку и пользоваться оттуда.
«
Ответ #6 :
Май 01, 2015, 00:59 »
В порядке бреда. (bat файл не хочется)
Допустим я всё своё приложение запихну в ещё один dll-костыль.
Делаю простую программу, которая:
- расширяет область видимости %PATH%
- загружает dll-костыль, который при старте статически загрузит QT-dll-ки, ведь область видимости %PATH% уже расширена.
Остается вопрос,
как программа может расширить собственный %PATH%, выданный ей при запуске? Какие функции следует использовать?
P.S.
Понимаю, что извращение ) Будем считать гимнастикой для ума.
Записан
Bepec
Гость
Re: Собрать все dll-ки в папку и пользоваться оттуда.
«
Ответ #7 :
Май 01, 2015, 01:51 »
Посчитай сколько бреда будет в середине и в конце этой авантюры
Bat файл самый нормальный вариант. Тем более его сочетание и твоё даёт больший простор. Ведь в бат файле можно расширить область видимости path отдельно для этой сессии и потом запускать файл. Хотя это надо пробовать и смотреть что получится. Но в теории должно сработать.
to neosapient - динамику можно указать в путях qt-conf.ini. И да, там так же можно указать путь для binaries, но подгрузка ini осуществляется уже после загрузки приложения
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Собрать все dll-ки в папку и пользоваться оттуда.
«
Ответ #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
Сообщений: 4350
Re: Собрать все dll-ки в папку и пользоваться оттуда.
«
Ответ #9 :
Май 01, 2015, 09:14 »
Цитата: Igors от Май 01, 2015, 08:55
По поводу "батничков" - ну это как бы приложение еще до запуска заявляет "я мелкое чмо"
И обсуждения не заслуживает
Очередной бред.
Скорее отсутствием "батничка" приложение заявляет "я мелкое чмо" и обсуждения не заслуживаю.
Крупные проекты, как правило, запускаются "батничками". На вскидку, тот-же qtcreator, такое "мелкое чмо" как kodi, google earth, "мелкота" virtualbox. Много такой "мелкоты" можно найти.
«
Последнее редактирование: Май 01, 2015, 09:20 от Old
»
Записан
Bepec
Гость
Re: Собрать все dll-ки в папку и пользоваться оттуда.
«
Ответ #10 :
Май 01, 2015, 09:15 »
Если беспокоит батник, напишите приложение
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...