Как сделать бинарный дистрибутив приложения Qt для Linux - PullRequest
17 голосов
/ 01 июня 2009

Я занимаюсь разработкой кроссплатформенного приложения Qt. Это бесплатно, но не с открытым исходным кодом. Поэтому я хочу распространять его как скомпилированный двоичный файл.

В Windows нет проблем, я упаковываю свои скомпилированные exe вместе с библиотеками MinGW и Qt, и все отлично.

Но в Linux есть проблема, потому что у пользователя могут быть общие библиотеки в его / ее системе, сильно отличающиеся от моей.

Руководство по развертыванию Qt предлагает два метода: статическое связывание и использование общих библиотек. Первый создает огромный исполняемый файл, а также требует статических версий многих библиотек, от которых зависит Qt, то есть мне придется пересобрать все из них с нуля. Второй метод основан на перенастройке динамического компоновщика непосредственно перед запуском приложения и мне кажется немного сложным.

Может ли кто-нибудь поделиться своим опытом распространения приложений Qt под Linux? Какой метод я должен использовать? С какими проблемами я могу столкнуться? Есть ли другие способы сделать эту работу?

Ответы [ 8 ]

15 голосов
/ 20 ноября 2012

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

Например, я храню свои библиотеки либо рядом с моим двоичным файлом, либо в каталоге с именем «mylib» рядом с моим двоичным файлом. Чтобы использовать это в моем файле QMake, я добавляю эту строку в файл .pro:

QMAKE_LFLAGS += -Wl,-rpath,\\$\$ORIGIN/lib/:\\$\$ORIGIN/../mylib/

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

12 голосов
/ 01 июня 2009

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

В качестве альтернативы, просто укажите минимальную версию библиотеки, которую ваши пользователи должны установить в системе.

4 голосов
/ 01 июня 2009

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

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

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

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

3 голосов
/ 01 июня 2009

ответ Sybreon - это именно то, что я сделал. Вы всегда можете добавить свои библиотеки в LD_LIBRARY_PATH или сделать что-то более необычное:

Настройте ваши поставляемые библиотеки Qt по одной на каталог. Напишите сценарий оболочки, запустите на исполняемом файле ldd и введите grep для «not found», для каждой из этих библиотек добавьте соответствующий каталог в список (назовем его $ LDD). После того, как они у вас есть, запустите двоичный файл с LD_LIBRARY_PATH , установленным в предыдущее значение плюс $ LDD.

Наконец, комментарий о том, что «мне придется восстановить их все с нуля». Нет, тебе не придется. Если у вас есть пакеты dev для этих библиотек, у вас должны быть файлы .a, вы можете статически ссылаться на них.

3 голосов
/ 01 июня 2009

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

Если у вас есть коммерческая лицензия, не берите в голову.

Если у вас нет коммерческой лицензии, у вас есть два варианта:

  1. Динамическое связывание с Qt v4.5.0 или новее (версии LGPL - вы не можете использовать предыдущие версии, кроме как в приложениях с открытым исходным кодом), или

  2. Откройте исходный код.

1 голос
/ 04 февраля 2018

Вероятно, самый простой способ создать пакет приложений Qt в Linux - это, вероятно, linuxdeployqt . Он собирает все необходимые файлы и позволяет вам создать AppImage , который работает в большинстве дистрибутивов Linux.

Убедитесь, что вы собрали приложение на самом старом, все еще поддерживаемом выпуске Ubuntu LTS, чтобы ваш AppImage мог быть указан в AppImageHub .

0 голосов
/ 20 февраля 2017

Вы можете заглянуть в папку QtCreator и использовать ее в качестве примера. Он содержит qt.conf и qtcreator.sh файлов в QtCreator / bin .

lib / qtcreator - это папка со всеми необходимыми библиотеками Qt * .so. Относительный путь задается внутри qtcreator.sh, который должен быть переименован в you-app-name.sh

импорт , плагины , qml находятся в каталоге bin . Путь к ним указывается в файле qt.conf . Это необходимо для развертывания приложений QML .

0 голосов
/ 03 июня 2009

В этой статье есть информация по теме. Я попробую сам http://labs.trolltech.com/blogs/2009/06/02/deploying-a-browser-on-gnulinux/

В двух словах:

  • Сконфигурировать Qt с помощью -platform linux-lsb-g ++
  • Связывание должно быть сделано с –lsb-use-default-linker
  • Упакуйте все и разверните здесь нужно несколько настроек, но я еще не пробовал, извините)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...