LINUX.ORG.RU

Qt программирование

 


0

1

Вспомнился давнишний вопрос - как-то я пытался писать хелловорды на этом языке(или фреймворке, как правильно?) короче все хорошо, пока я запускал из среды Qt Creator. Но вот захотелось мне скомпилировать это чудо чтобы запустить на другом ПеКа.
И, о Боже! - там нужно было что-то еще доп. загружать, компилировать среду разработки.

Перед тем как научиться собирать приложения в один exe необходимо собрать саму библиотеку Qt статически из исходников. На вашем копьютере будет две версии динамическая (которую вы установили) и статическая. Вы сможете переключаться межну этими сборками из Qt Creator


А я всего-навсего хотел скомпилировать один бинарник (либо exe под win) и запускать на любой x86-совместимой машине. Неужели все так сложно?
Статья из хабра - Qt — статическая линковка библиотеки под Windows

★★★★★

Всмысле сложно? Тянешь либы, и раз уж ты компилчешь, тянешь еще хидеры к ним + тулзы которыми будешь компелять.

matrixd ()

Скомпилируй статический бинарь.

matrixd ()

Кто-то еще против статики?

anonymous ()

компилировать среду разработки

Что? Где? Когда?

CrossFire ★★★★★ ()

Как выше сказали - используй статическую компиляцию.

Это нужно, чтоб не тянуть используемые библиотеки. В твой бинарник все динамические вызовы будут заменены статическими функциями из библотек полностью. Очень грубо говоря - всё библиотечное будет встроено в исполняемый бинарнь и, соответственно, библиотеки уже не потребуются на этапе использования Но для этого нужны библиотеки целевой архитектуры на этапе разработки, что очевидно.

nickleiten ★★★ ()

Что с тобой, сынок?

anonymous ()
Ответ на: комментарий от matrixd

как это сделать? нужно скомпилировать статические либы!

w1nner ★★★★★ ()
Последнее исправление: w1nner (всего исправлений: 1)

Есть такая штука windeployqt. Скармливаешь ей бинарник и она подкладывает в указанный каталог все зависимости из состава Qt.

grondek ()

так переноси бинарник на другой комп и запускай
если там qt либ нет, то поставь их (apt-get install)
разве с другими либами не так ?

x905 ★★★★★ ()

При чем тут Qt?

man динамические библиотеки

RazrFalcon ★★★★★ ()

Потому что статическая линковка редко нужна, обычно тянут с собой нужные либы и упаковывают всё это в инсталлятор.

Chaser_Andrey ★★★★★ ()
Ответ на: комментарий от Chaser_Andrey

Нафига тянуть с собой толстые либы в инстоляторе? обоснуйте, никогда это не понимал

anonymous ()
Ответ на: комментарий от anonymous

1. Удобство деплоя.

2. Они хорошо сжимаются инсталлятором.

3. На винте юзера лишних мегабайт 50 - уже десяток лет как не проблема.

Chaser_Andrey ★★★★★ ()
Ответ на: комментарий от Chaser_Andrey

Это не аргументы

Место не проблема, проблема в лишнем мусоре, проблема офтопа зоопарка сис библиотек, если инсталятор писал клинический придурок проверяющий силибы и подменяющий их. Нафига в дире библы непонятно, если юзаются они исключительно конкретным одним бинарем, что блин мешает собрать статикой?

anonymous ()
Ответ на: комментарий от anonymous

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

И в целом - какая разница, будет там пару файлов или один? Или пару десятков? Это всего лишь способ предоставления информации. Если существующие файлы и библиотеки мы разобьем ещё на пару десятков - что поменяется?

Chaser_Andrey ★★★★★ ()
Ответ на: комментарий от anonymous

если юзаются они исключительно конкретным одним бинарем, что блин мешает собрать статикой?

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

x905 ★★★★★ ()

там в QtCreator под виндой есть Deploy. Он все, что нужно тебе скопирует в нужную директорию для переноса на другую машину. У меня правда с QML какая-то свистопляска была при этом.

ossa ★★ ()
Ответ на: комментарий от x905

уху, особенно приятно разбираться когда тебе вывалили бинарь и забыли, что обновили либы, это просто чудесно. Про волшебный platforms, вечно забываемый я вообще молчу, вот нафига?

anonymous ()
Ответ на: комментарий от anonymous

Бери сорцы и компиляй сам, как тебе нравится.

Если пользуешься проприетарщиной - ну сам выбрал путь жрать, что дают.

Chaser_Andrey ★★★★★ ()
Ответ на: комментарий от Chaser_Andrey

Не дружище, это разделение труда. А жру что накорябает погромист

C:\WINDOWS\system32>dir D: /s | find /i "msvcr"
18.03.2010  07:15           770 384 msvcr100.dll
07.11.2007  00:19           655 872 msvcr90.dll
01.02.1999  23:00           266 293 msvcrt.dll
31.05.1998  15:06           326 656 MSVCRT40.dll
29.07.2008  08:05           655 872 msvcr90.dll
11.06.2011  00:58           773 968 msvcr100.dll
11.01.2004  23:00           348 160 msvcr71.dll
06.07.2009  12:54           181 515 msvcr71.zip
24.08.2009  09:15           761 152 msvcr100.dll
11.01.2004  23:00           348 160 msvcr71.dll
06.07.2009  12:54           181 515 msvcr71.zip
11.07.2006  18:35           348 160 msvcr71.dll
22.09.2005  23:05           626 688 msvcr80.dll
11.07.2006  18:35           348 160 msvcr71.dll
22.09.2005  23:05           626 688 msvcr80.dll

C:\WINDOWS\system32>dir C: /s | find /i "msvcr"
11.06.2011  00:58           773 968 msvcr100.dll
18.03.2010  12:16           771 424 msvcr100_clr0400.dll
05.10.2013  02:38           970 912 msvcr120.dll
11.07.2006  18:35           348 160 msvcr71.dll
22.09.2005  23:05           626 688 msvcr80.dll
14.04.2008  19:10           343 040 msvcrt.dll
18.08.2004  15:00           253 952 msvcrt20.dll
13.04.2008  21:30            61 440 msvcrt40.dll
16.02.2004  23:00           434 252 MSVCRTD.dll
14.04.2008  19:10           343 040 msvcrt.dll
18.08.2004  15:00           253 952 msvcrt20.dll

C:\WINDOWS\system32>

И вот это только маленькая часть проблемы и трэша. А ведь на моем компе чистенько, а то бы задолбался восстанавливать, то что годами работает

anonymous ()
Ответ на: комментарий от anonymous

А какая принципиальная разница тебе - вкомпиливать код в исполняемый файл или рядом ложить в виде библиотеки? Код всё равно будет присутствовать в том или ином виде.

Chaser_Andrey ★★★★★ ()
Ответ на: комментарий от Chaser_Andrey

Это хороший тон выкатывания релиза. Это гарантия того, что в релиз положили все что нужно. Без переписки, что на конкретной тачки не запускается и изысканий, чего ей падле не хватает. Не всегда за тачкой сидит специалист.

Наверное закончим. На данный момент я не вижу зачем нужно это разделение, для отдельно взятой программы.

anonymous ()
Ответ на: комментарий от anonymous

Ну например если либы LGPL, а твой код проприетарный и объектные файлы ты(или правообладатель) поставлять не хочешь.

mamba_namba_karamba ()
Ответ на: комментарий от mamba_namba_karamba

Явным образом LGPL не запрещает статическую компоновку (этот термин даже не используется в лицензии) и в настоящее время не было прецедентов, доказывающих обратное. В ряде коммерческих программ используется статическая компоновка с библиотеками, распространяемыми под LGPL.

Не вижу причин.

anonymous ()
Ответ на: комментарий от mamba_namba_karamba

Да и вообще говоря, пока вопрос религиозных лицензий не стоял в треде.

anonymous ()
Ответ на: комментарий от anonymous

На данный момент я не вижу зачем нужно это разделение, для отдельно взятой программы.

это решает программист, а не пользователь
удобства программисту от разделения есть, потому он и делает раздельно

x905 ★★★★★ ()
Ответ на: комментарий от x905

Воу воу, полехче, на компе нашего погромиста вообще нет исполняемых, то либы и исходники. О каком удобстве собственно речь?

anonymous ()
Ответ на: комментарий от anonymous

Явным образом LGPL не запрещает статическую компоновку (этот термин даже не используется в лицензии) и в настоящее время не было прецедентов, доказывающих обратное.

Думаю ты не хочешь стать первым прецендентом? Там формулировка неоднозначная, по сути на усмотрение суда. Где-то я читал что можно линковаться статически, но предоставлять пользователю свои объектники, чтоб он мог сам слинковаться со своей версией либы.

В ряде коммерческих программ используется статическая компоновка с библиотеками, распространяемыми под LGPL.

У ряда коммерческих программ могут быть другие лицензии (автор может так делать) или договоренности. Например для скайпа используется Qt, но линкуется вроде статически. Майкрософт вполне мог приобрести коммерческую версию Qt для этого.

mamba_namba_karamba ()
Ответ на: комментарий от anonymous

О каком удобстве собственно речь?

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

в будущем программ может получить развитие в виде дополнительных программ, слинкованных на эти библиотки, поэтому и тат не нужно линковать все в один бинарник

т.о. я для себя например не вижу причины делать один бинарь

x905 ★★★★★ ()
Ответ на: комментарий от x905

прям блин руками берешь и собираешь исключительно в машинных кодах. Что за юношеский нёх?

anonymous ()
Ответ на: комментарий от x905

И окстись уже, библиотека для разработки никак не связана с релизным бинарем. Хочешь выделить часть функционала, выдели и пользуйся дальше для разработки.

anonymous ()

На самом деле, просто забей на статику - она тебе не нужна. Воспользуйся штатной утилитой qtwindeploy.exe, которая идет в комплекте - и она скопирует все dll, qml и все на свете, что необходимо твоей проге для работы в папку, и у тебя получится переносимый вариант твоей проги.

Разве что вручную придется скопировать либу от директикса вроде, если твоя прога работает череp angle.

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

anonymous ()
Ответ на: комментарий от anonymous

И окстись уже, библиотека для разработки никак не связана с релизным бинарем

у меня связана, разве может быть иначе ?

x905 ★★★★★ ()
Ответ на: комментарий от w1nner

Ого! Ты прикинь. Я тут решил скомпилить сишний проект, оказывается какое-то gcc ставить надо! Ужас. Я всеголишь то хотел скомпилить сишный проект.

- Что нового мы узнали за сегодня дети!?

- Оказывается все действия требуют усилий!

- Прааавильно!

matrixd ()

Почему чудики из The Qt Company не распространяют статическую сборку своего Qt 5 без Qt Quick/QML и QtWebkit/QtWebEngine?

windeployqt.exe применительно к приложению-одной кнопке тянет 60МБ всяких либ, лол.

Для сравнения, JavaFX бандл приложения-кнопки со встроенным JVM — 30-40МБ.

Ну и где выгода от Qt 5 и C++, если приложение: 1. Весит больше;
2. Запускается так же долго (пока там все эти 60МБ в память развернутся), как и JavaFX приложение с JVM.

Кнопка на Qt 4 со статической линковкой — 9 МБ, пожатая upx'ом — 3 МБ и запускалась моментально.

Вывод: Выкинуть глюченный и жирный Qt 5, закинуть нормально работающий Qt. Статическую сборку можно скачать тут: http://www.npcglib.org/~stathis/blog/precompiled-qt4-qt5/

EXL ★★★★★ ()
Ответ на: комментарий от anonymous

Все понятно, все свободны

чё сказать то хотел ?

x905 ★★★★★ ()
Ответ на: комментарий от anonymous

Про волшебный platforms, вечно забываемый я вообще молчу, вот нафига?

Чтобы ты страдал, очевидно же.

Qt 4 приложение работало по клику на EXE, без всяких там platforms. Они требовались лишь для всяких там SQLite и прочего. А в Qt 5 нам сказали, мол теперь у вас будет МОДУЛЬНОСТЬ, мы разобьём жирные либы! И разбили. В итоге:

Qt 4 кнопка: QtGui, QtCore, EXE — 10MБ.
Qt 5 кнопка: QtGui, QtCore, QtWidgets, platforms/qwindows.dll — 20МБ

Я так понимаю это модульность уровня /KDE? Когда при разбивки библиотек на мелкие части их общий размер увеличивается в два раза. Я так думаю Qt 6 кнопка уже будет весить 200МБ. А обыватели всё так же будут кукарекать, мол: «На винте юзера лишних мегабайт 200 - уже десяток лет как не проблема». Хотя подобные возгласы уже сейчас встречаются в стане потребителей клизмоидов.

EXL ★★★★★ ()
Ответ на: комментарий от anonymous

windeployqt.exe копирует кучу шлака и говна на 60МБ. Которые приложением не используются вообще. Проще исходить из минимальной концепции для GUI приложения:

QtGui, QtCore, QtWidgets, platforms/qwindows.dll

Остальное, чего не хватает, добавлять ручками.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

На вопрос сверху лучше ответь.

Про жир я и так знаю, моя кнопка до сжатия 2кб, после 1,3кб. Развернутое в опере конечно больше места жрет, что не удивительно, выпиливать уже нечего, а пожатое надо развернуть

anonymous ()
Ответ на: комментарий от anonymous

DLL Hell

Решается статической линковкой CRT, если пофиг на безопасность, либо по гайдлайнам MS.

EXL ★★★★★ ()

Ты что, шутишь? Как еще то? нужно же объектный файл, хедеры и сама библиотека, что бы готовая программа собиралась и линковалась
Не хочешь статику - собирай динамично, в добавок еще либы потянешь
Хочешь в один exe - можно все упаковать или собрать статически, тогда компоновщик закинет все файлы в один и при обращении в памяти программа будет обращаться не к шаред объектам в систему, а к своим
Я конечно не ПРО программист и если ошибся - прошу поправить

mystery ★★ ()
Ответ на: комментарий от EXL

Жирно, но спишем на то, что все с собой. Дергать кернел и юзер по потреблению приятней

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.