Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
1

Как правильно собрать приложение Qt с динамической библиотекой?

19.07.2015, 12:06. Показов 2831. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Есть собранная статически библиотека. Исходники, .a-файл тоже имеются. Теперь нужно используя эту библиотеку написать приложение так, чтобы оно не тянуло с собой весь фреймворк Qt, а использовало то, что есть в библиотеке. Статически линковать приложение нельзя, потому что получается что библиотека весит 18Мб и приложение ровно столько же, хотелось бы разделить функционал библиотеки и функционал приложения.

Я попробовал собрать приложение компилятором Qt из коробки с подключенной библиотекой, но при запуске приложение сразу пытается найти Qt5Core.dll

Так же пробовал создать "Проект без использования Qt", но тогда он, естественно, не находит инклуды Qt-шных хедэров из библиотеки.

Попробовал подправить в этом проекте .pro-файл:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TEMPLATE = app
#CONFIG += console
#CONFIG -= app_bundle
#CONFIG -= qt
 
QT += core widgets gui
SOURCES += main.cpp
 
include(deployment.pri)
qtcAddDeployment()
 
INCLUDEPATH += C:/Qt/pro/my_qt_dll
 
LIBS += C:/Qt/pro/my_qt_lib/dev/libmy_qt_dll.a
но при попытке собрать это дело вываливаются ошибки вида:
C++ (Qt)
1
2
main.cpp:-1: ошибка: undefined reference to `qt_static_plugin_QWindowsIntegrationPlugin()'
main.cpp:-1: ошибка: undefined reference to `qt_static_plugin_QDDSPlugin()'
Как правильно все это дело организовать? Может нужно в библиотеке что-то исправить?

Qt 5.5.0 (MinGW), Windows

Добавлено через 7 часов 3 минуты
Разобрался. Оказывается всё решается в два щелчка: в исходники библиотеки нужно было добавить __declspec(dllexport) перед расшаренными функциями/классами.

Чтобы избавить от последней ошибки, связанной с плагинами, добавил в библиотеку перед испортом плагинов проверку:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef NO_IMPORT_QT_PLUGINS
#include <QtPlugin>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
Q_IMPORT_PLUGIN(QDDSPlugin)
Q_IMPORT_PLUGIN(QICNSPlugin)
Q_IMPORT_PLUGIN(QICOPlugin)
Q_IMPORT_PLUGIN(QJp2Plugin)
Q_IMPORT_PLUGIN(QMngPlugin)
Q_IMPORT_PLUGIN(QTgaPlugin)
Q_IMPORT_PLUGIN(QTiffPlugin)
Q_IMPORT_PLUGIN(QWbmpPlugin)
#endif
.pro файл приложения:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
TEMPLATE = app
CONFIG -= app_bundle
CONFIG -= qt
 
SOURCES += main.cpp
 
include(deployment.pri)
qtcAddDeployment()
 
# Заголовочные файлы библиотеки
INCLUDEPATH += C:/src/my_qt_lib
 
# Заголовочные файлы Qt
INCLUDEPATH += C:/Qt/5.5.0_Static/include\
    C:/Qt/5.5.0_Static/include/QtWidgets\
    C:/Qt/5.5.0_Static/include/QtCore\
    C:/Qt/5.5.0_Static/include/QtGui
 
# Определяем 
DEFINES += NO_IMPORT_QT_PLUGINS
 
# Библиотека импорта (.a или .lib)
LIBS += C:/src/my_qt_lib/dev/libmy_qt_dll.a
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.07.2015, 12:06
Ответы с готовыми решениями:

Подскажите пожалуйста с динамической DLL библиотекой
1. Разработка DLL библиотеки.// MathFuncsDll.h namespace MathFuncs { class MyMathFuncs ...

Управление динамической библиотекой через форму
Идея следующая: создать инжектор длл, который будет подрубать конкретную ддл-ку в конкретную игру....

Работа с библиотекой poplib для получения почты - Как правильно декодировать результат
Добрый день. Пытаюсь считать почту с через poplib: # -*- coding: utf-8 -*- import email, poplib...

как собрать приложение?
Простите, я новечёк в этом деле, обьясните пожалуйста как из исходников собрать приложение?

17
161 / 126 / 30
Регистрация: 30.05.2015
Сообщений: 380
19.07.2015, 14:17 2
Цитата Сообщение от WxMaper Посмотреть сообщение
нужно используя эту библиотеку написать приложение так, чтобы оно не тянуло с собой весь фреймворк Qt, а использовало то, что есть в библиотеке. Статически линковать приложение нельзя
Если то, что есть в библиотеке использует классы/методы Qt, то так сделать не получиться.
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
19.07.2015, 14:24  [ТС] 3
Цитата Сообщение от Kurles Посмотреть сообщение
Если то, что есть в библиотеке использует классы/методы Qt, то так сделать не получиться.
И как же я тогда сделал это? =) все получилось... библиотека 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
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Если лицензия, то вы ее все равно нарушили.
Это я знаю... но очень надеюсь заполучить лицензионную qt на работе в ближайшее время

Цитата Сообщение от RazrFalcon Посмотреть сообщение
а почему статически линковать нельзя?
Смысл в том, что будет использоваться одна библиотека для разных приложений. Приложение не должно иметь отношения к Qt.
Почему вы думаете что размер был бы тот же? Если бы я не использовал статическую линковку, то весь дистрибутив программы вместе с фреймворком весил бы почти 80Мб. Сейчас он весит всего лишь ~22Мб.
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
19.07.2015, 16:08 6
Цитата Сообщение от WxMaper Посмотреть сообщение
Приложение не должно иметь отношения к Qt.
Так вы в .pro прописываете пути к Qt. Значит зависит от Qt. Или вы неверно объяснили, или сами не поняли что сделали.

Цитата Сообщение от WxMaper Посмотреть сообщение
Если бы я не использовал статическую линковку
Понеслась... в 100500 раз: статическая линковка не уменьшает размер.

То что вы ужали размер до 22Мб - это потому, что вы при сборкк выкинули все что не нужно. Приложение на Qt5 и в динамику можно собрать весом меньше 20Мб.
А консольное, зависящее только от QtCore, так вообще будет ~2Мб без зависимостей.
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
19.07.2015, 16:16  [ТС] 7
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Так вы в .pro прописываете пути к Qt
В .pro файле прописываются пути к заголовочным файлам Qt только потому что они используются в библиотеке. В приложении я подключаю заголовочный файл библиотеки и библиотеку импорта. На выходе получаю маленькую эксешку размером 100Кб. Докидываю к ней одну библиотеку и запускаю. Никаких зависимостей.

Цитата Сообщение от RazrFalcon Посмотреть сообщение
То что вы ужали размер до 22Мб - это потому что при сборки выкинули все что не нужно.
Я это понимаю, но сам факт в том, что если я буду собирать стандартным компилятором, то библиотека тянет за собой очень много разных Qt5***.dll, которые в купе и составят почти весь фреймворк :/

Цитата Сообщение от RazrFalcon Посмотреть сообщение
А консольное, зависящее только от QtCore
Библиотека обеспечивает доступ к виджетам qt...
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
19.07.2015, 16:30 8
Цитата Сообщение от WxMaper Посмотреть сообщение
В приложении я подключаю заголовочный файл библиотеки и библиотеку импорта. На выходе получаю маленькую эксешку размером 100Кб. Докидываю к ней одну библиотеку и запускаю. Никаких зависимостей.
Зависимостей как раз валом, так как появляется промежуточный этап сборки этой вашей либы.
По сути все что вы сделали, это собрали Qt в статику, просто слинковали по кривому.
В данном случае линковать Qt через вашу либу или напрямую - не важно.

Цитата Сообщение от WxMaper Посмотреть сообщение
но сам факт в том, что если я буду собирать стандартным компилятором, то библиотека тянет за собой очень много разных Qt5***.dll
Нет. Приложению не нужен весь Qt, а только некоторые либы. Вам не нужно тянуть "весь фреймворк".
Если вы вашим способом пытались уменьшить общий размер - то у вас не вышло.
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
19.07.2015, 16:40  [ТС] 9
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Зависимостей как раз валом, так как появляется промежуточный этап сборки этой вашей либы.
Так её и не нужно собирать! Конечный пользователь (разработчик) получит набор заголовочных файлов и собранную библиотеку. Подключит заголовочный файл библиотеки, добавит пути поиска и будет работать с библиотекой. На выходе он получит приложение, которое никак не зависит от Qt, но зависит от этой самой библиотеки, которая умет рисовать окна и много чего еще... я скоро доделаю этот, как вам наверное показалось, изврат и выложу его, если вам интересно =)

Цитата Сообщение от RazrFalcon Посмотреть сообщение
Вам не нужно тянуть "весь фреймворк".
Я же объясняю, что собирал библиотеку обычным компилятором и накидывал к ней кутэшные библиотеки до тех пор, пока она наконец не завелась. Размер дистрибутива получался намного больше, чем сейчас.
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
19.07.2015, 16:54 10
Цитата Сообщение от WxMaper Посмотреть сообщение
Конечный пользователь (разработчик) получит набор заголовочных файлов и собранную библиотеку.
То есть вы закрыли сорцы? Ждите повестки в суд.

Цитата Сообщение от WxMaper Посмотреть сообщение
На выходе он получит приложение, которое никак не зависит от Qt, но зависит от этой самой библиотеки, которая умет рисовать окна и много чего еще...
То есть вы просто сделали обертку над Qt. Которая все равно зависит от Qt, пусть и на уровне либы.

Цитата Сообщение от WxMaper Посмотреть сообщение
обычным компилятором
А есть необычный?

Цитата Сообщение от WxMaper Посмотреть сообщение
накидывал к ней кутэшные библиотеки
Куда накладывали? Сорцы Qt что-ли нужные копировали - поверю.

Цитата Сообщение от WxMaper Посмотреть сообщение
Размер дистрибутива получался намного больше, чем сейчас.
Если функционал идентичен - то размер тоже будет идентичен.


PS: я не придираюсь к вам. Просто вы сделали что-то не понятное, и думаете что все сильно проще сделали, но по-моему просто не понимаете что вы вообще сделали.
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
19.07.2015, 17:10  [ТС] 11
Цитата Сообщение от RazrFalcon Посмотреть сообщение
То есть вы закрыли сорцы? Ждите повестки в суд.
Я их не закрывал, просто пока не выкладывал в публичный доступ, дабы избежать холиваров вроде "зачем это нужно", "велосипед", "костыль" и т.д. но даже так, задавая вполне безобидные вопросы не удается избежать этого только потому, что народ не понимает что было нужно, даже когда решение уже нашлось.

Цитата Сообщение от RazrFalcon Посмотреть сообщение
А есть необычный?
Ну всмысле не компилятор, а комплект. Есть стандартный комплект, который доступен после установки Qt, а есть другие комплекты, которые я сам добавляю, в том числе указываю профиль для сборки проекта, в котором указан путь к qmake.exe. И да, хоть компилятор у них и один и тот же, но лежат эти компиляторы в разных директориях xD Вот который шел вместе с Qt - это обычный, а тот который я сам добавил - это очень даже не обычный компилятор Зачем придираться то?

Цитата Сообщение от RazrFalcon Посмотреть сообщение
Если функционал идентичен - то размер тоже будет идентичен.


Цитата Сообщение от RazrFalcon Посмотреть сообщение
PS: я не придираюсь к вам. Просто вы сделали что-то не понятное, и думаете что все сильно проще сделали, но по-моему просто не понимаете что вы вообще сделали.
Да, вы правы, это обертка в чистом виде. Я понимаю что я хотел сделать и что получилось, а вот вы, увы, нет
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
19.07.2015, 17:22 12
Цитата Сообщение от WxMaper Посмотреть сообщение
Я понимаю что я хотел сделать и что получилось, а вот вы, увы, нет
Я понимаю что вы хотели сделать, я не понимаю зачем.
Если вы хотели уменьшить размер - то это делается по другому.
Если вы не хотели таскать кучу библиотек Qt - то это делается по другому.

Все что вы сделали, это инкапсулировали статически собранный Qt в отдельную либу. Смысла в это я не вижу никакого. Ибо "хотелось бы разделить функционал библиотеки и функционал приложения" на уровне файлов ничего не дает.
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
19.07.2015, 17:37  [ТС] 13
Цитата Сообщение от RazrFalcon Посмотреть сообщение
я не понимаю зачем
Вкратце: я пишу модуль для 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
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Даже закрывая глаза на то, что вы нарушаете лицензию Qt
Насколько я помню, qt любой версии, кроме community, допускает статическую линковку без раскрытия исходных кодов. Что-то изменилось?
В любом случае, как только проект будет более-менее юзабельным, он будет залит на гитхаб.

Цитата Сообщение от RazrFalcon Посмотреть сообщение
то проще было бы на .net сварганить, тогда и зависимостей меньше было бы.
Я уже сам об этом думал, но если Qt я хоть немного знаю и что-то могу с ним наворотить, то .NET - вообще никак и даже в глаза его не видел =о

Цитата Сообщение от RazrFalcon Посмотреть сообщение
На лине ни кто так делать не будет, на маке тем более
так это и не нужно
0
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
19.07.2015, 18:22 16
Цитата Сообщение от WxMaper Посмотреть сообщение
Насколько я помню, qt любой версии, кроме community, допускает статическую линковку без раскрытия исходных кодов. Что-то изменилось?
Тем что вы принуждаете пользователя купить лицензию за $350, что бы воспользоваться вашей прогой. И даже то что выложите ее на гитхабе ничего не изменит.

В остальном удачи, но Qt тут явно не лучший выбор, особенно если вам критичен размер.
0
96 / 82 / 22
Регистрация: 19.10.2013
Сообщений: 485
19.07.2015, 18:27  [ТС] 17
Цитата Сообщение от RazrFalcon Посмотреть сообщение
вы принуждаете пользователя купить лицензию за $350
Можно тут по подробнее? Разве если у меня уже есть лицензионный 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2015, 18:33
Помогаю со студенческими работами здесь

Как собрать приложение из исходников?
Добрый вечер, мне нужно собрать проект из исходников. Я нашел приложение в play market ,скачал...

Как собрать приложение с исходников
Всем привет Eсть одно приложение написанное на Питоне (исходники здесь:...

Как правильно собрать проект?
Здравствуйте. Помогите пожалуйста решить проблему. Как правильно собрать проект? Задаю вроде как...

Как правильно собрать DLL ?
У меня был проект консольного приложения. Потребовалось данное приложение преобразовать в DLL....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru