96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Как правильно собрать приложение Qt с динамической библиотекой?19.07.2015, 12:06. Показов 2831. Ответов 17
Метки нет (Все метки)
Доброго времени суток.
Есть собранная статически библиотека. Исходники, .a-файл тоже имеются. Теперь нужно используя эту библиотеку написать приложение так, чтобы оно не тянуло с собой весь фреймворк Qt, а использовало то, что есть в библиотеке. Статически линковать приложение нельзя, потому что получается что библиотека весит 18Мб и приложение ровно столько же, хотелось бы разделить функционал библиотеки и функционал приложения. Я попробовал собрать приложение компилятором Qt из коробки с подключенной библиотекой, но при запуске приложение сразу пытается найти Qt5Core.dll Так же пробовал создать "Проект без использования Qt", но тогда он, естественно, не находит инклуды Qt-шных хедэров из библиотеки. Попробовал подправить в этом проекте .pro-файл:
Qt 5.5.0 (MinGW), Windows Добавлено через 7 часов 3 минуты Разобрался. Оказывается всё решается в два щелчка: в исходники библиотеки нужно было добавить __declspec(dllexport) перед расшаренными функциями/классами. Чтобы избавить от последней ошибки, связанной с плагинами, добавил в библиотеку перед испортом плагинов проверку:
0
|
19.07.2015, 12:06 | |
Ответы с готовыми решениями:
17
Подскажите пожалуйста с динамической DLL библиотекой Управление динамической библиотекой через форму Работа с библиотекой poplib для получения почты - Как правильно декодировать результат как собрать приложение? |
161 / 126 / 30
Регистрация: 30.05.2015
Сообщений: 380
|
|
19.07.2015, 14:17 | 2 |
Если то, что есть в библиотеке использует классы/методы Qt, то так сделать не получиться.
0
|
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
|
|
19.07.2015, 14:24 [ТС] | 3 |
И как же я тогда сделал это? =) все получилось... библиотека 18Мб, exe-файл 100кб. Приложение подключает библиотеку и спокойно работает с ней
0
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
19.07.2015, 15:57 | 4 |
WxMaper, а почему статически линковать нельзя? Лицензия или что-то другое?
Если лицензия, то вы ее все равно нарушили. Смысл линковать одну либу или 10, размер тот же?
0
|
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
|
|
19.07.2015, 16:02 [ТС] | 5 |
Это я знаю... но очень надеюсь заполучить лицензионную qt на работе в ближайшее время
Смысл в том, что будет использоваться одна библиотека для разных приложений. Приложение не должно иметь отношения к Qt. Почему вы думаете что размер был бы тот же? Если бы я не использовал статическую линковку, то весь дистрибутив программы вместе с фреймворком весил бы почти 80Мб. Сейчас он весит всего лишь ~22Мб.
0
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
19.07.2015, 16:08 | 6 |
Так вы в .pro прописываете пути к Qt. Значит зависит от Qt. Или вы неверно объяснили, или сами не поняли что сделали.
Понеслась... в 100500 раз: статическая линковка не уменьшает размер. То что вы ужали размер до 22Мб - это потому, что вы при сборкк выкинули все что не нужно. Приложение на Qt5 и в динамику можно собрать весом меньше 20Мб. А консольное, зависящее только от QtCore, так вообще будет ~2Мб без зависимостей.
0
|
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
|
|
19.07.2015, 16:16 [ТС] | 7 |
В .pro файле прописываются пути к заголовочным файлам Qt только потому что они используются в библиотеке. В приложении я подключаю заголовочный файл библиотеки и библиотеку импорта. На выходе получаю маленькую эксешку размером 100Кб. Докидываю к ней одну библиотеку и запускаю. Никаких зависимостей.
Я это понимаю, но сам факт в том, что если я буду собирать стандартным компилятором, то библиотека тянет за собой очень много разных Qt5***.dll, которые в купе и составят почти весь фреймворк :/ Библиотека обеспечивает доступ к виджетам qt...
0
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
19.07.2015, 16:30 | 8 |
Зависимостей как раз валом, так как появляется промежуточный этап сборки этой вашей либы.
По сути все что вы сделали, это собрали Qt в статику, просто слинковали по кривому. В данном случае линковать Qt через вашу либу или напрямую - не важно. Нет. Приложению не нужен весь Qt, а только некоторые либы. Вам не нужно тянуть "весь фреймворк". Если вы вашим способом пытались уменьшить общий размер - то у вас не вышло.
0
|
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
|
|
19.07.2015, 16:40 [ТС] | 9 |
Так её и не нужно собирать! Конечный пользователь (разработчик) получит набор заголовочных файлов и собранную библиотеку. Подключит заголовочный файл библиотеки, добавит пути поиска и будет работать с библиотекой. На выходе он получит приложение, которое никак не зависит от Qt, но зависит от этой самой библиотеки, которая умет рисовать окна и много чего еще... я скоро доделаю этот, как вам наверное показалось, изврат и выложу его, если вам интересно =)
Я же объясняю, что собирал библиотеку обычным компилятором и накидывал к ней кутэшные библиотеки до тех пор, пока она наконец не завелась. Размер дистрибутива получался намного больше, чем сейчас.
0
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
19.07.2015, 16:54 | 10 |
То есть вы закрыли сорцы? Ждите повестки в суд.
То есть вы просто сделали обертку над Qt. Которая все равно зависит от Qt, пусть и на уровне либы. А есть необычный? Куда накладывали? Сорцы Qt что-ли нужные копировали - поверю. Если функционал идентичен - то размер тоже будет идентичен. PS: я не придираюсь к вам. Просто вы сделали что-то не понятное, и думаете что все сильно проще сделали, но по-моему просто не понимаете что вы вообще сделали.
0
|
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
|
|
19.07.2015, 17:10 [ТС] | 11 |
Я их не закрывал, просто пока не выкладывал в публичный доступ, дабы избежать холиваров вроде "зачем это нужно", "велосипед", "костыль" и т.д. но даже так, задавая вполне безобидные вопросы не удается избежать этого только потому, что народ не понимает что было нужно, даже когда решение уже нашлось.
Ну всмысле не компилятор, а комплект. Есть стандартный комплект, который доступен после установки Qt, а есть другие комплекты, которые я сам добавляю, в том числе указываю профиль для сборки проекта, в котором указан путь к qmake.exe. И да, хоть компилятор у них и один и тот же, но лежат эти компиляторы в разных директориях xD Вот который шел вместе с Qt - это обычный, а тот который я сам добавил - это очень даже не обычный компилятор Зачем придираться то? Да, вы правы, это обертка в чистом виде. Я понимаю что я хотел сделать и что получилось, а вот вы, увы, нет
0
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
19.07.2015, 17:22 | 12 |
Я понимаю что вы хотели сделать, я не понимаю зачем.
Если вы хотели уменьшить размер - то это делается по другому. Если вы не хотели таскать кучу библиотек Qt - то это делается по другому. Все что вы сделали, это инкапсулировали статически собранный Qt в отдельную либу. Смысла в это я не вижу никакого. Ибо "хотелось бы разделить функционал библиотеки и функционал приложения" на уровне файлов ничего не дает.
0
|
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
|
|
19.07.2015, 17:37 [ТС] | 13 |
Вкратце: я пишу модуль для php, который позволит писать gui приложения с использованием фреймворка Qt. (Пожалуйста, не надо критики, я достаточно начитался).
Библиотека - это и есть модуль, который подключает запакованный/зашифрованный php-файл, распаковывает его и выполняет с помощью zend engine (php5ts.dll). Исходник приложения, который использует библиотеку, содержит в себе всего пару строк - подключение библиотеки и вызов функции инициализации sapi-сервера для чтения зашифрованного php-файла. Это приложение нужно лишь для того, чтобы будущий разработчик мог установить иконку и прочую мета-информацию. На выходе разработчик получает всего 4 файла: php5ts.dll, engine.dll, application.exe и main.php.
0
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
19.07.2015, 18:01 | 14 |
Ок. Я так и думал.
Даже закрывая глаза на то, что вы нарушаете лицензию Qt, есть еще одна проблема - почему именно Qt? Ваш подход будет работать только для винды. На лине ни кто так делать не будет, на маке тем более. У них другие правила. А раз уж остаётся чисто винда - то проще было бы на .net сварганить, тогда и зависимостей меньше было бы.
0
|
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
|
|
19.07.2015, 18:12 [ТС] | 15 |
Насколько я помню, qt любой версии, кроме community, допускает статическую линковку без раскрытия исходных кодов. Что-то изменилось?
В любом случае, как только проект будет более-менее юзабельным, он будет залит на гитхаб. Я уже сам об этом думал, но если Qt я хоть немного знаю и что-то могу с ним наворотить, то .NET - вообще никак и даже в глаза его не видел =о так это и не нужно
0
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
19.07.2015, 18:22 | 16 |
Тем что вы принуждаете пользователя купить лицензию за $350, что бы воспользоваться вашей прогой. И даже то что выложите ее на гитхабе ничего не изменит.
В остальном удачи, но Qt тут явно не лучший выбор, особенно если вам критичен размер.
0
|
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
|
|
19.07.2015, 18:27 [ТС] | 17 |
Можно тут по подробнее? Разве если у меня уже есть лицензионный Qt, я не вправе распространять своё приложение в сети?
0
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
19.07.2015, 18:33 | 18 |
WxMaper, я не юрист, это нужно на форуме Qt спрашивать. Но суть в том что вы лицензию покупаете на Qt для личного использования, а вы по сути предоставляете Qt как часть своего продукта.
То есть вы покупаете право использовать Qt в коммерческих целях, а не распространять его.
0
|
19.07.2015, 18:33 | |
19.07.2015, 18:33 | |
Помогаю со студенческими работами здесь
18
Как собрать приложение из исходников? Как собрать приложение с исходников Как правильно собрать проект? Как правильно собрать DLL ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |