|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||||||||||||||||||||||||||||||||||||
GNU/Linux Qt5.* - Линкуем статически23.01.2014, 19:10. Показов 143952. Ответов 62
Метки нет (Все метки)
В связи с отсутствием в данной теме мануала по статической линковке приложений Qt, решил исправить данный недостаток
![]() Оговорюсь сразу: приветствуется беспощадная критика, особенно, что касается скриптов) Итак: 1) Как обычно, нужно пересобрать фреймвор статически. Для этого скачиваем архив с исходными текстами отсюда: http://qt-project.org/downloads На данный момент имя тар-бола - qt-everywhere-opensource-src-5.2.0.tar.gz 2) Переходим в каталог с тар-болом. Разархивируем и распаковываем. Потом нужно сконфигурировать, собрать и установить тонну исходников. Делаем это так ( за дополнительными параметрами, если нужно, обращайтесь ./configure --help):
)Заходим в QtCreator, Tools > Options > Build & Run > Qt Versions Добавляем путь к новому qmake ( в нашем случае /usr/local/Qt5_static/bin/qmake ). Затем идем на вкладку Kits и добавляем новый набор инструментов, только укзываем ему qmake, только что добавленный на предыдущем шаге. Озаглавим этот набор Qt5_staticKit, например. Нажимаем Ok. 4) Ctrl+5, выбираем вверху проект, который мы хотим собрать статически, и щелкаем по новому Kit'y Qt5_staticKit. Выбираем Release конфигурацию. Тааак, здесь пока все. 5) Перелазим в .pro file. Добавляем туда
![]() Если посмотреть на вывод ldd, то можно увидеть, что приложение зависит еще от целой кучи не Qt-ных библиотек. Они могут быть бинарно-несовместимыми со своими предыдущими версиями (особенно, если написаны на С++) даже если они имеются на чужом компьютере. Например: Кликните здесь для просмотра всего текста
Пересобирать каждую из них, в случае, когда нет статической, довольно проблематично и долго и не всегда возможно ( кто хочет пусть попробует ), поэтому есть вариант поставлять их вместе со своим приложением. Большая вероятность того, что большинство этих библиотек будут на чужой машине, но выполнив еще немного действий, вы застрахуете и себя, и пользователя от лишней головной боли.Вот что делаем: 1) Нужно скопировать симлинк, который выводит ldd, и библиотеку на которую он указывает в каталог с нашим приложением. ( в нашем случае /path/to/app/lib ). Симлинк использует динамический загрузчик при загрузке библиотеки для приложения во время выполнения, ну а библиотека, на которую он указывает это собственно данные. Вот наваял такой скрипт (еще раз напомню, что правки и улучшения очень приветствуются c башем знаком 2 дня )
Выполняем:
Последний штрих: в .pro файл нужно добавить -rpath опцию линковщику, чтобы загрузчик потом знал, что поставляемые нами вместе с приложением библиотеки лежат в папке lib/ (в данном случае):
![]() Как из этого сделать программный пакет, смотрите документацию к своему дистрибутиву GNU/Linux. Ps. На MacOS процедура практически не должна отличаться, но у меня нет возможности проверить. Pss. Если ваше приложени базируется на плагинах, то они по своей природе не могут линковаться статически.. Смотрите документацию http://qt-project.org/doc/qt-4... t-x11.html и все вытекающие перекрестные ссылки по плагинам. ________________________________________ ________________________________________ ___________________________ Вроди бы ничего не забыл... Надеюсь, статейка кому-нибудь поможет разобраться. Спасибо и удачи
6
|
||||||||||||||||||||||||||||||||||||
| 23.01.2014, 19:10 | |
|
Ответы с готовыми решениями:
62
Timestamp->QdateTime (Qt5+Firebird+Linux) Qt5 перенос приложения из windows7 в linux (Raspbery)
|
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
| 23.01.2014, 20:28 | |
|
По поводу башскрипта который копирует либы. Это вы в нем прогу на С компилите и ей парсите ввод ldd?
Не проще было бы сразу на баше это сделать вместо того что бы такие странные вещи делать?
0
|
|
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|||
| 23.01.2014, 20:32 [ТС] | |||
Только вот
Если вы знаете как, то можете сделать это на баше, Если пожелаете, конечно, - это намного упростит реализацию. И включим ваше решение сюда.
0
|
|||
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
| 23.01.2014, 20:34 | |
|
+ на x86_x64 либы лежат в /usr/lib64
+ на том же gentoo qt либы лежат в /usr/lib64/qt4, так что лучше использовать абсолютные пути при копировании
0
|
|
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|||
| 23.01.2014, 20:42 [ТС] | |||
|
P.s. В арче например текущая версия Qt вообще без цифры, на неё просто сслыаться нужно как на 'qt', а остальные /usr/lib/qt4{,3,5} уже по надобности.
0
|
|||
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
||||||||||||||||||||||
| 23.01.2014, 21:16 | ||||||||||||||||||||||
|
Мое решение, возможно не самое лучшее, но всяко лучше того что выше:
В генту симлинк на оборот
Добавлено через 7 минут Даже проще:
К слову у вас в инструкции пропущена самая важная часть - установка зависимостей для компиляции.
3
|
||||||||||||||||||||||
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
|||||||
| 23.01.2014, 21:50 | |||||||
|
Автор любезно согласился принимать критические замечания.
1.
Да и какой смысл в статической линковке, если с бинарником все равно нужно распространять зоопарк библиотек. Если какие-то библиетеки окажутся других версий, или вовсе отсутствуют в дистрибутиве, то да, имеет смысл скачать их исходники. Это займет не больше времени, чем разработка вышеприведенного оригинального кросс-скрипта. 2. Непонятна целевая аудитория такого распрстранения программы. Если программа открытая, то статическая компановка обычно не требуется. Достаточно указать зависимости в пакете. Если проприетарная, то такой подход нарушает LGPL, под которой распростаняется Qt, кроме оговоренного (на мой взгляд достаточно экзотического) случая, когда автор предоставит средства для работы своей программы с любой новой версией Qt.
1
|
|||||||
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
| 23.01.2014, 22:14 | |
|
gng,
1) Почему вы указываете ldd не исполняемый файл? Все либы собрать статически почти не возможно. Обычно тягают только Qt + мелочевка. От системных либ никуда не уйти. 2) LGPL не запрещает статическу сборку.
0
|
|
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
||||
| 23.01.2014, 22:57 | ||||
|
1. Это свободно распространяемая программа, либо 2. Автор вместе с программой предоставляет инструменты, позволяющие запустить её с новыми версиями библиотеки Qt (которые ещё выйдут) Добавлено через 3 минуты
0
|
||||
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||||||
| 23.01.2014, 23:05 [ТС] | ||||||
Нужно будет как-то отредактировать пост и включить туда ваш вариант.Кстати, еще нужно сделать, там где "игнорируем некоторые либы" пропуск всех соответствующих ld.* я никак не пойму как прописать это условие что-то. Она принадлежит пакету libxcb, хотя должна принадлежать libxcb-devel, которого, к слову, даже нет. (ну я только в официальных репах смотрел). Что касается libc.a и libstdc++.a, они, безусловно, присутствуют, но их, насколько я знаю, небезопасно линковать статически. Если libc.a еще можно, потому что ее ABI, грубо говоря, прост как валенок, то libstdc++.a требует какой-то runtime identification/support ... что-то такое для поддержки исключений RTTI, что, в свою очередь требует динамич. линковки. Более того, есть опция -static-libstdc++, в таком случае g++ принимает решение: можно/нужно ли линковать статически. В моем случае не связывал ни в какую. Может я не туда прописывал эту опцию в .pro файле, черт иногда поймет этот qmake... Вообще, это один из подходов, который описан в документации. Вот http://qt-project.org/doc/qt-4... on-package Второй в списке. ________________________________________ _______ P.s. Спасибо за внимание и критику
0
|
||||||
| 23.01.2014, 23:11 | |||||
![]() ![]() Добавлено через 2 минуты Добавлено через 49 секунд
0
|
|||||
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||||
| 23.01.2014, 23:18 [ТС] | ||||
|
Добавлено через 1 минуту Добавлено через 1 минуту Написал я это потому, что выше был разговор о том, что с динамическими либами почти всегда идут статические. Статические обычно являются частью devel-пакета. я и написал, что такого пакета нет, как и статических библиотек с ним идущих Добавлено через 1 минуту
0
|
||||
| 23.01.2014, 23:48 | ||||
|
0
|
||||
|
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
|
|
| 24.01.2014, 00:00 | |
|
Собственно обычная проблема зоопарка линукс дистров. Проще сорцы выложить, а те кому - надо соберут.
Ну или deb/rpm который поставит нужные зависимости.
2
|
|
|
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
|
||||
| 24.01.2014, 00:34 | ||||
|
Добавлено через 5 минут 2. LGPL - ваша программа может быть проприетарной при динамической линковке либо при соблюдении вышеописанного условия. 3.Commercial - покупаете и линкуете как хотите.
0
|
||||
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
||
| 24.01.2014, 00:51 [ТС] | ||
|
В пакете же libxcb.pkg.* будет libxcb.so.2.25 (например) и сслыка на нее, libxcb.so.2
0
|
||
|
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
|
|
| 27.01.2014, 14:02 [ТС] | |
|
0
|
|
|
114 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 162
|
||||||||||||||||
| 26.12.2014, 17:16 | ||||||||||||||||
|
Никак не получается собрать библиотеки. Выскакивает ошибка:
Добавлено через 1 час 22 минуты kUbuntu 14.10 Добавлено через 3 часа 44 минуты Все установилось, надо было выполнять команды из под рута Добавлено через 27 минут В общем все прописал, скомпилировал, а прога все равно не запускается на компе без Qt. Требует шрифты, которрые лежат в папке с Qt библиотеками. Как это исправить?
0
|
||||||||||||||||
| 26.12.2014, 17:16 | |
|
Помогаю со студенческими работами здесь
20
Знакомство с GNU/Linux
Помагите с Debian Gnu Linux ? Не работает kali linux на VirtualBox 6.0.16 r135674 (Qt5.6.2) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes.
А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения
развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит:
токи, напряжения и их 1 и 2 производные при t = 0;. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|