Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [qt] независимый экзешник


Автор: gordmiand 29.4.2010, 22:21
подскажите пож-та как можно скомпилировать проект, чтобы чисто один его экзешник (или весь проект) работал бы на компе (под линуксом), где вообще нет Qt...

Автор: borisbn 29.4.2010, 22:39
Точно не помню, но по-моему в лицензии на Open Source Qt сказано, что обязательно распространять свой exe-шник вместе с библиотеками Qt

Автор: gordmiand 29.4.2010, 22:49
жаль, что точно не помните - очень надо....
а с какими именно "....с библиотеками Qt"?

Автор: borisbn 30.4.2010, 06:17
В windows'е с DLL-ками. Например, если используешь gui, нужно распространять QtCore4.dll и QtGui4.dll. Посмотри лицензию на их сайте

Автор: Любитель 30.4.2010, 17:39
Ну это ж уже обсуждалось ни раз..

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

А для собирания одного мегафайла - надо пользоваться статической линковокй. Для этого надо вначале собрать статические либы Qt. Информация есть в доках.

PS Может есть активисты, чтобы сделать инструкцию по использованию статической линковки, strip-а и "лицензионными" отличиями?

Автор: Deex42Iv 30.4.2010, 19:23
Цитата(Любитель @  30.4.2010,  17:39 Найти цитируемый пост)
Может есть активисты, чтобы сделать инструкцию по использованию статической линковки, strip-а и "лицензионными" отличиями

да, было бы неплохо

Автор: gordmiand 30.4.2010, 19:30
Любитель: а в каких именно "доках"? дайте ссылочку пож-та....

Автор: KL7 1.5.2010, 09:20
Например, вот это - http://www.qtcentre.org/wiki/index.php?title=Building_static_Qt_on_Windows. Или вот http://www.formortals.com/build-qt-static-small-microsoft-intel-gcc-compiler/.


Автор: gordmiand 1.5.2010, 18:48
да, но это под винды, а мне бы под линукс надо... 
хотя может и не стои заморачиваться - значит достаточно распространения вместе с экзешником объектных файлов проекта, чтобы он работал на компе без Qt? 

Автор: KL7 1.5.2010, 20:43
Вы уж определитесь: Вам под линукс или все-таки exe-шники   smile 
А вообще динамически слинкованному exe-шнику как правило нужны QtCore4.dll, QtGui4.dll, mingwm10.dll и (для Qt 4.6) libgcc_s_dw2-1.dll.

Вот наверно то, что Вам надо - http://www.qtcentre.org/wiki/index.php?title=Building_static_Qt_on_Linux. Но там для старенького Qt. 

Автор: gordmiand 1.5.2010, 23:45
KL7: имелся ввиду пусковой файл программы в линуксе - то есть тот же экзешник программы...
по Вашей ссылке - там все заморочено...уж лучше буду таскать с исполняемым файлом проги набор дополнительных файлов, чем курочить кути...

Автор: KL7 2.5.2010, 09:45
Цитата(gordmiand @  1.5.2010,  23:45 Найти цитируемый пост)
имелся ввиду пусковой файл программы в линуксе - то есть тот же экзешник программы...

Ясно. Просто никогда не видел, чтобы bin-ы exe-шниками называли  smile 

Автор: gordmiand 2.5.2010, 20:03
KL7 : ну извините - я на линукс токо перехожу, а так все еще мыслю категориями и понятиями виндов...
так все-таки - для корректной работы приложения на компе без Qt достаточно иметь в проекте его объектные *.o -файлы? 

Автор: KL7 2.5.2010, 23:36
Цитата(gordmiand @  2.5.2010,  20:03 Найти цитируемый пост)
так все-таки - для корректной работы приложения на компе без Qt достаточно иметь в проекте его объектные *.o -файлы?  

Нет. 
Для работы qt-приложения под виндой нужно иметь QtCore4.dll, QtGui4.dll, mingwm10.dll и (для Qt 4.6) libgcc_s_dw2-1.dll. Первые две можно найти в папке qt\bin, вторые две - в mingw\bin. 
Как обстоят дела в прочих ОС - не в курсе.

А объектные файлы тут упоминали по поводу лицензионного соглашения. Я не знаток в этой области, но сейчас бесплатная Qt доступна с GNU LGPL лицензией и согласно ей
Цитата

Должна существовать возможность связывания разрабатываемого ПО с новейшей версией программы или библиотеки, охваченной LGPL. Наиболее часто используемый способ сделать так — это использовать «подходящий механизм разделяемых библиотек для связывания». Альтернативой этому является разрешение для статической библиотеки, если предоставлены либо исходный код, либо приспособленные для связывания объектные файлы.


Вобщем если Вы серьезно решите нести свой проект в массы, то должны выдать обществу не только толстый exe-шник со статически слинкованными библиотеками, но и исходники или объектные файлы, чтобы народ потом смог пересобрать Ваше приложение, если у них возникнет такое желание.

А для запуска на машине без qt Ваши *.o файлы никак не помогут. Нужны именно qt-шные библиотеки.

Только проблема в том, что QtCore4.dll + QtGui4.dll - это около 12 метров. Т.е. Ваш дистрибутив (программа + библиотеки) будет весит 12+ метров. Даже если там тренировочный 'hello world'.
А статически слинкованный exe, упакованный upx-ом, у меня получается около 2-3 метров. Мне, конечно, стыдно за вероятное нарушение лицензии, но лабы преподам я сдаю именно в таком варианте.

Автор: gordmiand 3.5.2010, 19:24
KL7: ясно... то есть достаточно таскать с собой всего 4 файла - QtCore4.dll, QtGui4.dll, mingwm10.dll и (для Qt 4.6) libgcc_s_dw2-1.dll? а то со статической линковкой Qt под линукс как-то совсем сложно....

может кто знает доходчивые ссылки для такой линковки для Qt 4.6???

Автор: kamre 4.5.2010, 06:25
Цитата(KL7 @ 2.5.2010,  23:36)
Мне, конечно, стыдно за вероятное нарушение лицензии, но лабы преподам я сдаю именно в таком варианте.

А откуда здесь нарушение лицензии? smile Исходники нужно прилагать только по требованию в таком случае. Или "преподы" их требуют, а вы не показываете? )

Автор: Любитель 4.5.2010, 10:02
Цитата(gordmiand @  3.5.2010,  19:24 Найти цитируемый пост)
может кто знает доходчивые ссылки для такой линковки для Qt 4.6??? 

Чем официальные доки не устраивают? http://doc.trolltech.com/4.6/deployment-x11.html#static-linking

Автор: KL7 4.5.2010, 11:17
Цитата

А откуда здесь нарушение лицензии? smile Исходники нужно прилагать только по требованию в таком случае. Или "преподы" их требуют, а вы не показываете? )

Ясно. Значит нарушений никаких нет - преподаватели мало интересуются qt, а поэтому и исходниками визуализаций.

Цитата

Чем официальные доки не устраивают?

Я так понял, gordmiand-а интересует, что нужно предоставить пользователю вместе с исполняемым файлом, чтобы запустить qt-приложение под линуксом не имея полностью установленной qt. Под виндой тянутся dll-ки, а что под линуксом?

Автор: Любитель 4.5.2010, 12:17
Цитата(KL7 @  4.5.2010,  11:17 Найти цитируемый пост)
чтобы запустить qt-приложение под линуксом не имея полностью установленной qt.

Вариант №1 - линковать статически (если действительно нужна полная независимость, то это preferred way).
Вариант №2 - тащить libQt*.so в каталоге с исполняемым файлом и сделать скрипт, ставящий LD_LIBRARY_PATH и затем запускающий приложение.

Автор: gordmiand 4.5.2010, 15:17
Любитель: спасибо за ссылку - попробую по ней действовать - отпишусь....
пока пробовал действовать по приведенным выше ссылкам на статическую линковку qt в линуксе - одни проблемы - после долгих инсталляций-мучений в ппрофилях креатора почему-то появляется профиль для кутей версии 4.3 (хотя у меня 4.6.), старый профиль для 4.6. уже становится некорректен и все виджеты начинают плыть - их размеры и др., куда-то "пропадают" для компилятора некоторые виджеты, которые прекрасно виделись им при динамически собранном qt...

Автор: gordmiand 4.5.2010, 19:26
Любитель: делал по Вашей ссылке:

1. Выполняю (под рутом)
Код

cd /path/to/qt 
./configure -static -prefix /path/to/qt 


в ответ выбрал опцию „o“ - чтобы „to use the Open Source Edition“
выбрал 'yes' - „to accept this license offer“
много чего „считается“...заканчивается вроде без ошибок предложением

Qt is now configured for building. Just run 'gmake'.
Once everything is built, you must run 'gmake install'.
Qt will be installed into /usr/local/Trolltech/Qt-4.6.1

я его не выполняю....
    
2. Выполняю команду 
Код

make sub-src

много чего „считается“...

заканчивается ошибкой 
Код

../../include/QtGui/private/../../../src/gui/styles/qgtkstyle_p.h:276: error: ‘gtkStyle’ was not declared in this scope
gmake[1]:  [.obj/release-static/qguiplatformplugin.o] Error 1
gmake[1]: Leaving directory `/Qt/qt/src/gui'
gmake:  [sub-gui-install_subtargets-ordered] Error 2


3. затем захожу в папку приложения и из нее пытаюсь выполнить команду
Код

make clean

в ответ выдается сообщение 
Код

„ make: *** No rule to make target `/Qt/qt/mkspecs/linux-g++/qmake.conf', needed by `Makefile'.  Stop.“


+ ко всему вообще нет рабочего профиля - см. рисунок...
 команды
Код

make clean
 PATH=/path/to/Qt/bin:$PATH
 export PATH
 qmake -config release
 make

надо выполнять в консоли или где-то (?) прописывать?
дальше уже не пробовал...хотелось бы с п. 2, 3 сначала разобраться – в чем там дело и как все корректно "проинсталлировать"?


Автор: Любитель 4.5.2010, 21:01
1. Я не знаю зачем там sub-src smile Делай просто make. Главное задать для ./configure ключи static и префикс указать (чтоб существующую Qt не убить).
2. Смотри ./configure -help - у тебя нету GTK-хидеров видать. Отключи QGTKStyle (там что-то типа -no-style gtk, я точно не помню).
3. Затем при сборке своего проекта вместо просто qmake, меняем PATH, а затем запускаем (соответственно будет использоваться нужный qmake).

Автор: gordmiand 4.5.2010, 22:03
1. то есть в
Код

./configure -static -prefix /path/to/qt 

в качестве /path/to/qt  задается отдельный от основного Qt путь к установке статической версии кутей? мне в принципе 2 таких варианта кутей и не надо наверное - достаточно статической...я ее поверх старой (динамической версии) лепил...а как тогда можно будет переключаться с динамической на статическую и обратно версии работы Qt?
2. а куда данную "команду" 
Код
-no-style gtk
 вставлять ? в продолжение команды
 ./configure ???
3. пожалуйста поподробнее по поводу Вашего п.3: то есть вместо или в добавок к уже указанным qt-путям в переменной PATH дописать путь к динамической версии qmake (которая будет в отдельно от основных-динамических кутей папке)? 
а команды
Код

make clean
 PATH=/path/to/Qt/bin:$PATH
 export PATH
 qmake -config release
 make

вообще надо с консоли выполнять? (на первой из них у меня ошибка - см. ее выше...)

Автор: Любитель 6.5.2010, 09:26
Цитата(gordmiand @  4.5.2010,  22:03 Найти цитируемый пост)
 вставлять ? в продолжение команды

Да. Смотри help по configure (./configure -help) - там расписаны все опции.

Цитата(gordmiand @  4.5.2010,  22:03 Найти цитируемый пост)
а как тогда можно будет переключаться с динамической на статическую и обратно версии работы Qt?

Всё очень просто - нужно использовать нужный qmake. Для этого при его запуске PATH и меняется.

Цитата(gordmiand @  4.5.2010,  22:03 Найти цитируемый пост)
то есть вместо или в добавок к уже указанным qt-путям в переменной PATH дописать путь к динамической версии qmake (которая будет в отдельно от основных-динамических кутей папке)? 

Ну перетереть весь PATH - очевидно неверно. Дописать вначале (и именно при запуске qmake для статика) - наиболее логично (пути из PATH всегда просматриваются по порядку).

Цитата(gordmiand @  4.5.2010,  22:03 Найти цитируемый пост)
вообще надо с консоли выполнять

Ну.. в общем да. Можно сделать скриптик маленький, который это всё будет делать - для удобства.

Цитата(gordmiand @  4.5.2010,  22:03 Найти цитируемый пост)
(на первой из них у меня ошибка - см. ее выше...)

make clean нужен в том случае, если проект уже собирался с обычной qt - чтобы удалить всякий "мусор".

И да - само собой последнии строки (по крайней мере qmake/make) выполняются в каталоге с .pro файлом проекта.

Автор: gordmiand 6.5.2010, 19:39
на другом компутере - при выполнении команды ./configure -static -prefix.... в какой-то момент возникает ошибка "You might need to modify the include and library search paths by editing
QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in /Qt_4.6./qt/mkspecs/linux-g++." - в чем тут дело и как поправить??? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)