В этой статье мы рассмотрим процесс создания AppImage — универсального формата для распространения Linux-приложений. Ниже представлена ссылка на набор скриптов, который автоматизирует сборку AppImage, включая поиск зависимостей, копирование библиотек и упаковку приложения.

? Что такое AppImage?

AppImage — это формат, позволяющий упаковать приложение и все его зависимости в один исполняемый файл, который можно запускать на большинстве дистрибутивов Linux без установки.

Можно сказать, что это контейнер в виде одного файла, но при запуске он монтируется как виртуальная файловая система (SquashFS), чтобы приложение видело свои библиотеки и иконку.

? Как собрать AppImage с нуля

  1. Подготовка окружения

    Создайте структуру каталогов для вашего приложения:

    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

  2. Создание файла .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 — категории приложения для системного меню.

  3. Создание файла 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.

  4. Скачивание appimagetool

    Скачайте инструмент для сборки AppImage:
    Перейти к релизам appimagetool на GitHub

  5. Сборка 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)


  1. Dima_88888
    04.10.2025 19:57

    Сделай видео с сборки AppImage. Бери приложение с GitHub и собери на видео приложение в формате AppImage, это будет лучше и проще


  1. wl2776
    04.10.2025 19:57

    Про зависимости не очень понятно.

    Я правильно понял, что если я установлю несколько AppImage-й с разными приложениями, каждое из которых требует, к примеру, Qt, то у меня будет несколько копий Qt?

    И где граница между внешними зависимостями, которые надо положить в AppImage, и системными библиотеками, которые не надо туда класть?

    С libc понятно, а, скажем, GStreamer? Или та же Qt для KDE? Они очень даже тянут на звание системных.


    1. 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

        Такие библиотеки считаются «частью приложения» и должны поставляться вместе с ним.


      1. Notevil
        04.10.2025 19:57

        А есть опция использовать системно установленную библиотеку, и если ее нет, то свою, поставляемую?