В этой статье мы рассмотрим процесс создания AppImage — универсального формата для распространения Linux-приложений. Ниже представлена ссылка на набор скриптов, который автоматизирует сборку AppImage, включая поиск зависимостей, копирование библиотек и упаковку приложения.
? Что такое AppImage?
AppImage — это формат, позволяющий упаковать приложение и все его зависимости в один исполняемый файл, который можно запускать на большинстве дистрибутивов Linux без установки.
Можно сказать, что это контейнер в виде одного файла, но при запуске он монтируется как виртуальная файловая система (SquashFS), чтобы приложение видело свои библиотеки и иконку.
? Как собрать AppImage с нуля
-
Подготовка окружения
Создайте структуру каталогов для вашего приложения:
app_name.AppDir/ ├── AppRun ├── app_name.desktop ├── icon_name.png └── usr/ ├── bin/ │ └── app_name └── lib/ ├── lib_name1.so └── lib_name2.so
usr/bin/app_name
- это исполняемый файл вашей программы.В каталоге
lib
должны находиться внешние зависимости, такие как Qt, OpenCV, FFMPEG и не нужно включать системные библиотеки, такие какlibc.so
,libm.so
, так как это приведёт к конфликту с библиотеками ОС, на которой будет запущен образ AppImage.Обновление:
Где проходит граница между системными библиотеками и внешними зависимостями? Системные библиотеки — это базовые компоненты, гарантированно присутствующие во всех дистрибутивах Linux (напримерlibc.so
.6
,libm.so
.6
,libpthread.so
.0
,libdl.so
.2
,librt.so
.1
,libgcc_
s.so
.1
,libstdc++.so.6
,libX11.so.6
,libXext.so
.6
). Их не нужно включать в образ, иначе возможны конфликты с библиотеками системы. Все остальные зависимости, особенно такие, как Qt, GStreamer, OpenCV, FFMPEG, SDL2 и подобные, считаются внешними и должны лежать внутриAppDir/usr/lib
. Это гарантирует, что AppImage запустится на любой системе независимо от установленных пакетов.Пример папки можно скачать здесь:
Перейти к шаблону папки AppDir в моём репозитории на GitHub -
Создание файла
.desktop
Файл
.desktop
необходим, чтобы связать приложение с иконкой и правильно отобразить его через графические оболочки. Пример минимальногоapp_name.desktop
:[Desktop Entry] Name=app_name Exec=app_name Icon=icon_name Type=Application Terminal=false Categories=Utility
Name
— имя приложения, отображаемое в меню.Exec
— команда для запуска приложения (обычно совпадает с исполняемым файлом внутри AppDir).Icon
— имя иконки (без расширения) в папке AppDir.Type
— тип записи, всегдаApplication
для приложений.Terminal
— указывает, нужно ли запускать приложение в терминале.Categories
— категории приложения для системного меню.
-
Создание файла
AppRun
AppRun
— это исполняемый файл, который является точкой входа для AppImage. Он отвечает за настройку окружения и запуск основного приложения. Пример минимальногоAppRun
:#!/bin/sh # Determine the directory where the AppImage is mounted HERE="$(dirname "$(readlink -f "$0")")" # Set the library path to include the AppImage's lib directory export LD_LIBRARY_PATH="${HERE}/usr/lib:${LD_LIBRARY_PATH}" export QT_PLUGIN_PATH="${HERE}/usr/lib/plugins" export QT_DEBUG_PLUGINS=1 # Execute the main application exec "${HERE}/usr/bin/app_name" "$@"
Здесь
LD_LIBRARY_PATH
говорит о том, что внешние библиотеки стоит искать в папкеusr/lib
внутри контейнера.Если в вашем приложении используется Qt, то необходимо также указать путь к плагинам
QT_PLUGIN_PATH
.Файл
AppRun
должен быть исполняемым (chmod +x AppRun
) и находиться в корне AppDir. Он позволяет гарантировать, что все зависимости приложения будут найдены и корректно загружены при запуске AppImage. -
Скачивание
appimagetool
Скачайте инструмент для сборки AppImage:
Перейти к релизам appimagetool на GitHub -
Сборка AppImage
Перейдите в каталог, содержащий
app_name.AppDir
, и запустите инструмент:chmod +x ./appimagetool-x86_64.AppImage ./appimagetool-x86_64.AppImage app_name.AppDir
Это создаст файл
app_name-x86_64.AppImage
, который является вашим готовым приложением.
? Автоматизация процесса с помощью скриптов
Ниже представлена ссылка на скрипты, которые автоматизируют процесс сборки AppImage:
build-appimage.sh: Основной скрипт для сборки AppImage, который скачивает инструмент
appimagetool
, и производит сборку папки.AppDir
в этом же каталоге.copy-app-libs.sh: Скрипт для поиска и копирования ELF-библиотек и Qt-плагинов. Данный скрипт упрощает поиск внешних зависимостей приложения с помощью утилит
ldd
,linuxdeployqt
и с помощью парсинга названий библиотек из лога ошибок ELF-файла.
Эти скрипты помогут автоматизировать процесс создания AppImage и упростят распространение ваших приложений.
✅ Заключение
Сборка AppImage — это эффективный способ распространения Linux-приложений. Используя приведённые скрипты, вы можете автоматизировать этот процесс и сосредоточиться на разработке вашего приложения.
Комментарии (4)
wl2776
04.10.2025 19:57Про зависимости не очень понятно.
Я правильно понял, что если я установлю несколько AppImage-й с разными приложениями, каждое из которых требует, к примеру, Qt, то у меня будет несколько копий Qt?
И где граница между внешними зависимостями, которые надо положить в AppImage, и системными библиотеками, которые не надо туда класть?
С libc понятно, а, скажем, GStreamer? Или та же Qt для KDE? Они очень даже тянут на звание системных.
gregpost Автор
04.10.2025 19:57Да, всё верно — каждая AppImage содержит собственный набор библиотек
.so
, включая Qt, если приложение её требует. Это нормальная практика: Qt-библиотеки занимают не так много места, зато гарантируют, что приложение запустится одинаково на любой системе.Если исключить Qt из пакета, то при запуске AppImage динамический линковщик будет искать её в системных путях (
/usr/lib
,/lib
и т.д.). Поэтому можно не включать библиотеку, если вы уверены, что нужная версия есть в целевой системе, но это делает образ менее переносимым.AppImage-сообщество и проект
linuxdeploy
придерживаются следующего практического правила:-
Не включаются системные библиотеки, которые гарантированно присутствуют во всех дистрибутивах Linux (так называемые base system libraries).
Это, например:libc.so.6, libm.so.6, libpthread.so.0, libdl.so.2, librt.so.1, libgcc_s.so.1, libstdc++.so.6, libX11.so.6, libXext.so.6
-
Включаются внешние зависимости, которые не входят в стандартную базу Linux или могут отличаться между дистрибутивами и версиями.
Это, например:Qt*, GStreamer, OpenCV, SDL2, FFMPEG, libpng, libjpeg, libtiff
Такие библиотеки считаются «частью приложения» и должны поставляться вместе с ним.
Notevil
04.10.2025 19:57А есть опция использовать системно установленную библиотеку, и если ее нет, то свою, поставляемую?
-
Dima_88888
Сделай видео с сборки AppImage. Бери приложение с GitHub и собери на видео приложение в формате AppImage, это будет лучше и проще