Меню Рубрики

Статическая сборка qt linux

Статическая компиляция Qt из исходного кода

Система: Debian 8. Итак, мне необходимо собрать Qt Creator статически. Что делаю:

Устанавливаю необходимые зависимости

Скачиваю и распаковываю исходники

Распаковал в /home/user_name/. Перехожу туда с помощью cd

Конфигурирую с опцией статической сборки

Если я всё верно понял, то в систему должен установится Qt Creator статически, т.е. свои проекты я могу собирать единым файлом. Однако, в списках всех программ (dpgk) qt отсутствует. Как его запустить? Или я просто делаю неверно что-то или чего-то не понимаю? Скомпилированные файлы находятся здесь:

Подскажите, как грамотно собрать QT из исходников(обязательно статически, чтобы я мог наконец все используемые библиотеки вшить в исполняемый файл) и самое главное — запустить?

1 ответ 1

Итак, отвечаю на собственный вопрос, ибо так никто и не помог и пришлось разбираться. Для статической компиляции QT нужно следующее: Установить Qt Creator. Посмотреть в about версию используемого Qt. Иногда, для сборки нужны дополнительные зависимости. Устанавливаем, если надо:

Далее пройти сюда, выбрать нужную версию и в папке single скачать архив с исходниками:

Следующим пунктом будет скачивание исходников, любыми способами, и распаковкой в конкретную папку(к примеру):

После того, как распаковка закончится, создаем папку выходного каталога скомпилированного Qt:

Переходим в каталог распаковки:

Далее запускаем конфигуратор сборки:

, где -static — это то, ради чего всё затевалось. Статическая сборка проектов. Остальное можно посмотреть в документации.

И затем выполняем команды сборки и последующей установки Qt в систему:

Ждем некоторое количество времени, всё зависит от конфигурации ПК, где происходит компиляция.

После компиляции в созданной папке /usr/lib/Qt5_st/bin будет лежать файл qmake, к которому надо указать путь в самой QT (Инструменты-Параметры-Профили QT-Добавить — и выбрать файл qmake из папки /usr/lib/Qt5_st/bin)

Далее надо нажать применить — перейти на вкладку комплекты — нажать добавить, внизу в списке выбрать профиль QT и выбрать созданный на предыдущем шаге профиль. Осталось только нажать применить и ОК. Можно закрыть настройки, и добавить профиль к текущему проекту. Для этого надо нажать CTRL + 5 и добавитьк проекту новый вариант сборки.

И на этом всё, при компиляции проекта на выходе будет единый бинарный файл, включающий в себя все используемые библиотеки Qt.

Источник

GNU/Linux Qt5.* — Линкуем статически

В связи с отсутствием в данной теме мануала по статической линковке приложений Qt, решил исправить данный недостаток
Оговорюсь сразу: приветствуется беспощадная критика, особенно, что касается скриптов)
Итак:
1) Как обычно, нужно пересобрать фреймвор статически. Для этого скачиваем архив с исходными текстами отсюда: http://qt-project.org/downloads
На данный момент имя тар-бола — qt-everywhere-opensource-src-5.2.0.tar.gz

2) Переходим в каталог с тар-болом. Разархивируем и распаковываем. Потом нужно сконфигурировать, собрать и установить тонну исходников. Делаем это так ( за дополнительными параметрами, если нужно, обращайтесь ./configure —help ):

Пересобирать каждую из них, в случае, когда нет статической, довольно проблематично и долго и не всегда возможно ( кто хочет пусть попробует ), поэтому есть вариант поставлять их вместе со своим приложением. Большая вероятность того, что большинство этих библиотек будут на чужой машине, но выполнив еще немного действий, вы застрахуете и себя, и пользователя от лишней головной боли.
Вот что делаем:
1) Нужно скопировать симлинк, который выводит ldd, и библиотеку на которую он указывает в каталог с нашим приложением. ( в нашем случае /path/to/app/lib ). Симлинк использует динамический загрузчик при загрузке библиотеки для приложения во время выполнения, ну а библиотека, на которую он указывает это собственно данные.

Вот наваял такой скрипт (еще раз напомню, что правки и улучшения очень приветствуются c башем знаком 2 дня )

Теперь все это дело в .tar.gz и можете делиться с друзьями своим приложением

Как из этого сделать программный пакет, смотрите документацию к своему дистрибутиву GNU/Linux.

Ps. На MacOS процедура практически не должна отличаться, но у меня нет возможности проверить.
Pss. Если ваше приложени базируется на плагинах, то они по своей природе не могут линковаться статически..
Смотрите документацию http://qt-project.org/doc/qt-4. t-x11.html и все вытекающие перекрестные ссылки по плагинам.
____________________________________________________________ _______________________________________________
Вроди бы ничего не забыл.
Надеюсь, статейка кому-нибудь поможет разобраться.
Спасибо и удачи

Timestamp->QdateTime (Qt5+Firebird+Linux)
Направьте на путь истинный. В исходниках Qt5 есть небольшой пример, sqlbrowser. И есть база FB. Всё.

Qt5 перенос приложения из windows7 в linux (Raspbery)
Добрый вечер! Извиняюсь, не так давно знаком с Qt и линукс, нужна помощь. Задача стоит.

Удаление GNU\Linux из автозагрузки Kali Linux x64
Здравствуйте. Установил криво Kali Linux на диск С. Потом удалил все его файлы. Но в автозагрузке.

Знакомство с GNU/Linux
требуется объединить содержимое 2-х файлов,например task1.cpp и task3.cpp в единый новый файл и.

Да и при чем тут версия Qt, если вы просто собирает либы из ldd.

Добавлено через 7 минут
Даже проще:

Статические библиотеки, указанные в приведенном списке распространяются вместе с динамическими, часто в рамках одного пакета с заголовочными файлами. Особенно удивляет отсутствие статических libc и libstdc++ шестой версии, присутствующие практически везде, где есть gcc.
Да и какой смысл в статической линковке, если с бинарником все равно нужно распространять зоопарк библиотек.
Если какие-то библиетеки окажутся других версий, или вовсе отсутствуют в дистрибутиве, то да, имеет смысл скачать их исходники. Это займет не больше времени, чем разработка вышеприведенного оригинального кросс-скрипта.

2. Непонятна целевая аудитория такого распрстранения программы. Если программа открытая, то статическая компановка обычно не требуется. Достаточно указать зависимости в пакете. Если проприетарная, то такой подход нарушает LGPL, под которой распростаняется Qt, кроме оговоренного (на мой взгляд достаточно экзотического) случая, когда автор предоставит средства для работы своей программы с любой новой версией Qt.

Источник

How can I build fully static QT application in Linux?

Sorry for my English.
I want build QT application without dependencies from any shared libraries(qt libs and glibc and ALL libraries). For this I download QT sources, build it with -static option, check all *.a libraries by ldd. This libraries have not dependencies from shared .so lib. I install new QT libraries to /opt/Q5.8 and add /opt/Q5.8/bin to $PATH.
Then I create test Hello world project.
main .cpp:

Then I run qmake | make.
qmake create Makefile successful, but make output errors:

What am I doing wrong?

2 Answers 2

You have to download and compile Qt from source and pass in the static flag to get it to let you build your own static binaries.

When you do this, you will have a binary that doesn’t require qt libraries on the target machine, but your binary will be 13+MB for the basic QtCore and QtGui and more libraries built in. compared to the 0.5+MB that is more typical for a dynamically linked Qt executable.

Use a download file like this.

Untar it, then do an appropriate configure and make command.

After you do that, then you can build static Qt programs all day.

Источник

Кросс-компиляция Qt5 под Linux для Win x32/x64/static/shared

Документирование получения системы кросс-компиляции под Linux для Windows x32/x64/static/shared и сборка последней на момент описания Qt 5.4.1 в лайт-версии (для указанных четырех целей). Для себя, глубоко-обожаемого, ну и для пользы обществу.

Многие разработчики приходят к выводу, что использование *nix (в частности Linux) более предпочтительно для разработки приложений, используя фрэймворк Qt. И тому есть причины. Qt изначально ориентирована на *nix инструментарий, типа autotool, make, perl… И второй момент, под никсами есть прекрасный инструмент — valgrind, под виндой порта пока его не видел. Ну и последняя причина: просто удобно иметь набор инструментария для создания приложений под различные целевые платформы — в одном месте.

0. Сценарий сборки

Все шаги делаем последовательно. Желательно не объединять все скрипты в последовательную сборку по причине необходимости промежуточного «человечного» контроля. Разные дистрибутивы Линуха, разные среды исполнения, наборы инструментариев… Простой алгоритм: сделал очередной шаг, убедился в отсутствии ошибок, пошел делать следующий. Итак, сам сценарий:

  • 1. Предварительная подготовка
  • 2. Установка среды кросс-компиляции MXE
  • 3. Загрузка и настройка Qt 5.4.1
  • 4. Сборка комплектов Qt 5.4.1 для четырех целей (см. сабж)
  • 5. Прописка собранного в QtCreator

1. Предварительная подготовка

У вас установлен дистрибутив Линукса. Желательно все это делать на на продакшен-компе (не на живом Линуксе), а установленном в виртуальную машину. Я например, пользуюсь VMWare, но это дело вкуса. Выбор дистрибутива Линукса — так же дело вкуса. Лично я предпочитаю Gentoo Linux, собственно под ним всю эту кухню и настраиваю. Если есть сложности в настройке, у меня есть небольшая статейка по этому вопросу: «Установка и настройка Linux Gentoo под VMWare».

Итак, у вас есть настроенный Линукс и вы работаете не под рутом! Для дальнейшей работы вам нужно проверить присутствие следующих установленных пакетов, или доустановить:

Вся дальнейшая установка будет производиться в каталог $HOME/dev. Если у вас таковой присутствует — либо переименовываете его, либо внимательно правите скрипты, которые будут приведены далее. Для всех манипуляций со скачиваемыми внешними файлами/скриптами/библиотеками будет использован каталог $HOME/setup. Все замечания выше относительно $HOME/dev — в силе и к этому каталогу.

2. Установка среды кросс-компиляции MXE

Предварительное замечание об MXE. Это отличнейшая система сборки тулчейнов для кросс-компиляции. Но есть одно «но». В данный момент не существует стабильной ветки. Авторы до поры до времени вели две ветки в своем git-репозитарии — стабильную и «разработческую». Сейчас ветки объединены. Разработка идет ну очень активно — изменения сбрасываются чуть ли не раз 1-3 дня. А это чревато тем, что «то работает сборка, то не работает». Некоторые важные для меня библиотеки, в частности клиентская часть PostgreSQL, собираются без ошибок, но в нерабочем состоянии. Потратил неделю не исследование явных косяков. Исправляем эти «недочеты». Итак:

Должны получить в каталоге $HOME/setup следующий набор скриптов:

Скрипты не будут иметь атрибута «исполняемый» просто в целях безопасности — предотвращения «непреднамеренного случайного» запуска. Запускаем первый скрипт 1.setup-first.sh. Он создаст структуру подкаталогов $HOME/dev…, выкачает систему кросс-компиляции mxe, делает двойную сборку gcc тулчейнов (для обеспечения поддержки posix-threads), соберет основные базовые библиотеки, пропатчит и соберет клиентскую часть библиотеки PostgreSQL.

Важно: Если ваша хостовая система по ABI отличается от «x86_64-pc-linux-gnu», в скрипте вручную удалите патч ABI. Ищем по комментарию «# патчим файлик определения ABI проекта MXE». А лучше пропишете ваш.

3. Загрузка и настройка Qt 5.4.1

Запускаем скрипт 2.setup-qt5.sh. Его задача выкачать исходники Qt 5.4.1, развернуть их в подкаталог qt5/ и пропатчить нужное.

4. Сборка комплектов Qt 5.4.1 для четырех целей

Для, собственно, сборки четырех видов Qt 5.4.1 предназначены остальные скрипты:

  • 3.1.build-qt-x32-shared.sh
  • 3.2.build-qt-x32-static.sh
  • 3.3.build-qt-x64-shared.sh
  • 3.4.build-qt-x64-static.sh

Запуск производиться точно так же как и в предыдущем пункте:

Однако есть важное замечание, могущее помочь вам сэкономить время на сборку. Если у вас многоядерный компьютер — имеет смысл запускать сборки параллельно. Для этого вы открываете второй(третий, четвертый) терминал, и в терминале запускаете очередной скрипт. Лично мне удобно все действия проводить в дополнительном ssh-клиенте. Как показала практика, на моем Core i7 (4 ядра, с гипертрейдингом) — прирост общего времени сборки наблюдается при двух параллельно работающих сборках. Если более — производительность не возрастает, а чаще всего падает.

Итак, все четыре скрипта отработали. Что мы получили в результате?

$HOME/dev/cross/mxe/usr/bin — тут собраны исполняемые модули всех четырех тулчейнов
$HOME/dev/cross/mxe/usr/тулчейн — тут собраны заголовки и либы тулчейнов
$HOME/dev/stuff/сборки — тут собраны все виды Qt для последующей кросс-компиляции

Осталось все это подключить к использованию.

5. Прописка собранного в QtCreator

Самостоятельно выкачиваете Qt 5.4.1 для вашего линуха (ссылка на x32 или x64), самостоятельно производите установку. Проверяете работоспособность.

После этого регистрируете собранное вами. Открываем QtCreator, выбираем в главном меню «Инструменты» ► «Параметры» ► «Сборка и запуск». Далее, вся регистрация предусматривает три шага:

1) Регистрация компиляторов (Закладка «Компиляторы»)
2) Регистрация профилей Qt (Закладка «Профили Qt»)
3) Регистрация комплектов (Закладка «Комплекты»)

Добавляя очередной компилятор, выбирайте тип «Особый». Нужный компилятор ищем в $HOME/dev/cross/mxe/usr/bin типа bla-bla-bla-g++. Ниже указываем путь к системной утилите make, типа /usr/bin/make. Далее выставляем ABI. Если выбрали static-версию, внизу добавьте mkspec — «win32-g++.static» (без кавычек). Остальные поля несущественны. Зарегали все четыре вида компиляторов, нажимаем «Применить»

Переключаемся на закладку «Профили Qt». Добавляя профили ищем их в $HOME/dev/stuff/bla-bla-bla/bin/qmake. Зарегали все четыре профиля, нажимаем «Применить»

Переключаемся на закладку «Комплекты». Добавляем очередной комплект, выбирая нужный компилятор + профиль Qt. В комплектах, где статическая сборка желательно прописать и mkspecs как на шаге-1. Зарегали все четыре комплекта, нажимаем «Применить»

Заключение

Вполне отдаю себе отчет — собранное может содержать определенные ошибки, т.к. собиралось далеко не автором ни Qt, ни PostgreSQL, даже не участником проекта MXE. Да и отсутствие простейших проверок во время сборки, не говоря уж о юнит-тестах, предполагает, что вы осознаете «сырость» сделанного. Тем не менее, после получения данного набора тулчейнов, я протестировал свои проекты, примеры из поставки Qt. В интересующих меня модулях (UI, PostgreSQL, http, QtScript, и ряда других) ошибок не обнаружил.

… Обещанное про фулл-сборку. Если вам очень повезет, и MXE, на момент вашего интереса будет в стабильном состоянии, получить фулл сборку очень просто:

Вангую, по этому варианту сборки вас ждет разочарование с вероятностью 87.14%, но если все будет без косяков, то полученные сборки Qt5 будут размещены в $HOME/dev/cross/mxe/usr/ /qt5

Всем удачного кодинга.

Редакторский дайджест

Присылаем лучшие статьи раз в месяц

Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.

Похожие публикации

Кросскомпиляция Qt-4.8.0 под mingw32 (x86) в Gentoo (x86_64)

5 лет с Gentoo Linux

Qt + Ruby = настройка в Linux и Windows

Курсы

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Комментарии 34

The decision to no longer use ICU was made as a result of discussions at QtCS and on the development list.

Предварительное замечание об MXE. Это отличнейшая система сборки тулчейнов для кросс-компиляции.

Чем она лучше по сравнению с crossdev, раз уж вы говорите про Gentoo? crossdev позволяет сказать «crossdev x86_64-pc-mingw32» и получить на выходе готовый тулчейн. Причем без скачивания подозрительный shell-скриптов и с регистрацией в системном менеджере пакетов (что позволяет безнапряжно обновлять/удалять тулчейны). Куда отличнее-то?

Спасибо за информацию. Я статический Qt 5 (мне нужны были только QtWidgets) собирал для Windows прямо в Windows, не было под рукой машинки с дистрибутивом GNU/Linux (даже виртуальной).

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

  1. MinGW-w64 32-bit.
    Идеальный вариант — использовать тот, что идёт в бандле Qt 5 с MinGW под Windows, наверняка этот бандл у вас уже установлен. Если нет — не забудьте отметить инструментарий MinGW при установке.
  2. Python 2.x.x.
    Он потребуется системе сборки Qt для генерации некоторых заголовочных файлов. Я использовал Python версии 2.7.9.
  3. Исходники Qt 5.

И в принципе, для Qt Widgets и QtQuick этого более чем достаточно. Далее устанавливаем Python и распаковываем архив с исходниками в удобное для сборки место. Выше по уровню создаём директорию build-Qt5-static, картина должна быть такая:

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

Здесь есть важный момент. Если вы хотите, чтобы исполнительны файлы ваших приложений были полностью статические и автономные, то вам необходимо отредактировать файл qt-everywhere-opensource-src-5.4.1/qtbase/mkspecs/win32-g++/qmake.conf следующим образом:

Это «отвяжет» ваши исполнительные файлы от таких библиотек, как:

  • libgcc_s_dw2-1.dll
  • libstdc++-6.dll
  • libwinpthread-1.dll

Так как они будут влинкованы статически. На выходе получится автономный исполнительный файл, который должен запускаться и работать в любой операционной системе Windows, начиная с Windows 2000 (или XP).

Теперь, когда всё готово к конфигурированию и компиляции, можно запускать процесс. Лично я для этого воспользовался таким вот простеньким bat-сценарием, назовём его Qt5.4.1-build-static.bat:

Объясню некоторые очевидные вещи. Переменная окружения QTDIR определяет то, куда будет установлен наш статически собранный Qt 5; исправьте эту переменную в соответствии со своими предпочтениями. Переменная окружения PATH задаёт путь до исполнительных файлов инструментария MinGW-w64 (компиляторы, линковщики, архиваторы и прочие утилиты), кроме того, в PATH определён путь до установленного Python и его скриптов. Задайте значение этой переменной в соответствии с установленным в вашу систему окружением для сборки. Далее идёт длинная команда конфигурирования (список всех параметров можно посмотреть в документации или выполнив configure.bat -help), команда сборки (опция -jX используется для распараллеливания, рекомендуемое значение зависит от характеристик вашего компьютера и рассчитывается по формуле X = N + 1, где N — число ядер вашего процессора); и завершается сценарий командой установки, которая скопирует скомпилированные библиотеки и инструменты в директорию, определённую в QTDIR.

Файл Qt5.4.1-build-static.bat, с вашими установками, кидаем в директорию build-Qt5-static и запускаем. Запускать bat-сценарий лучше всего не двойным кликом по нему, а из командной строки, чтобы иметь возможность среагировать на ошибку. Для этого: заходим с помощью проводника в директорию build-Qt5-static, и держа зажатой клавишу Shift, кликаем на пустое место в директории правой кнопкой мышки. В появившемся контекстном меню выбираем пункт «Открыть окно команд». В командной строке вводим имя bat-сценария: Qt5.4.1-build-static.bat и нажимаем клавишу Enter для запуска продолжительной процедуры сборки. Пока Qt 5 собирается можно выпить чашку кофе. Я бы даже сказал, много чашек кофе.

Небольшой совет. Если сборка завершилась с ошибкой, а вы использовали параллельную компиляцию (mingw32-make c опцией -jX), то часто возникает ситуация, что ошибка компиляции «улетела далеко наверх» и её не видно в окне и буфере командной строки. Для того, чтобы посмотреть на чём же всё-таки прервалась компиляция, достаточно повторно запустить mingw32-make без опции -jX. Через некоторое время (когда цели mingw32-make соберутся и он перейдёт на ту, что приводит к ошибке компиляции), в выхлопе появится и досадная ошибка.

Подробнее про сборку Qt 5 для Windows можно почитать официальную документацию и страничку в официальной Wiki.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Старые игры для linux
  • Старые версии firefox linux
  • Стандартный пароль postgres linux
  • Стандартный пароль linux mint
  • Стандартный пароль linux kali linux