Как заставить программу работать на других компьютерах?

Я сделал игру, используя C++ и Allegro 5, она отлично работает на моем компьютере с Linux. Я хотел бы знать, как создать пакет, который я мог бы экспортировать на другой компьютер с Linux, и заставить его работать без установки Allegro. Спасибо


person Marco    schedule 22.12.2016    source источник
comment
Посмотрите документацию allegro, может там написано как упаковать библиотеку вместе с приложениями.   -  person Barmar    schedule 22.12.2016
comment
Скомпилируйте код в объектный (.o) файл и статически свяжите его с файлами allegro, возможно, удалив неиспользуемые символы. Это может быть незаконным, однако вам следует прочитать лицензию allegro для получения информации о его распространении вместе с вашей программой.   -  person ForceBru    schedule 22.12.2016
comment
wiki.allegro.cc/index.php?title=Static_and_Dynamic_Link прочитать статическую раздел ссылок   -  person willll    schedule 22.12.2016


Ответы (2)


Я должен был понять это некоторое время назад, далее следует руководство, основанное на шагах, которые сработали для меня. Вполне может быть «лучший» способ статической ссылки на аллегро.

Для начала вам понадобятся статические библиотеки для allegro. Если в вашем дистрибутиве их нет, вам придется собрать их самостоятельно:

  1. Клонируйте исходный код (скажем, вы клонируете его в каталог с именем allegro).
  2. Создайте каталог сборки: cd allegro && mkdir build && cd build
  3. cmake .. -DSHARED=off. Это указывает, что нам нужны статические (не общие) библиотеки.
  4. make
  5. Теперь вы должны увидеть библиотеки, заканчивающиеся расширением .a под lib в каталоге сборки.

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

gcc main.c -o main -Lpath/to/allegro/build/lib -lallegro-static

Если вы не устанавливаете статические библиотеки по своему стандартному пути к библиотеке (например, /usr/lib), вам нужен аргумент -L, чтобы предоставить компоновщику путь к статическим библиотекам, которые вы только что создали.

Если вы просто попробуете вышеописанное, вы заметите ряд ошибок компоновщика для других библиотек. При статической компоновке вам нужно будет вручную указать флаги компоновщика для зависимостей allegro. Честно говоря, я не помню, почему это так, но я просто знаю, что должен это сделать.

Чтобы определить эти зависимости, попробуйте один раз собрать программу с общими библиотеками:

gcc main.c -o main -lallegro

Затем выполните ldd для полученного двоичного файла (main). Вы должны увидеть что-то вроде:

linux-vdso.so.1 (0x00007fff1dbfd000)
liballegro.so.5.2 => /usr/lib/liballegro.so.5.2 (0x00007f8b802ea000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f8b7ff4c000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007f8b7fc48000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f8b7fa2b000)
...
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f8b7c551000)

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

gcc main.c -o main -lallegro -lm -lpthread -lX11 ...

Вы заметите, что вам не нужно ссылаться на все в выводе ldd, вы можете поиграть с ним, чтобы найти минимальный набор флагов компоновщика, который вам нужен. Вам понадобится больше флагов компоновщика, если вы компонуете дополнительные модули. Например, для ссылки на lallegro_audio-static потребуются флаги вроде -lpng для ссылки на библиотеку PNG.

В конце концов, вы найдете набор флагов, который позволит вам статически ссылаться на аллегро. Чтобы проверить результат, запустите ldd на вашем статически связанном двоичном файле; вы должны заметить, что allegro больше не включается в вывод, так как пользователям больше не нужно будет динамически связываться с allegro.

person rcorre    schedule 23.12.2016

Ответ для Allegro одинаков для любой библиотеки. Это не делает ничего особенного. Ответ предыдущего автора касается деталей реализации, поэтому я расскажу об этом с точки зрения 10 000 футов:

У вас есть три варианта для ЛЮБОЙ библиотеки.

  • Скомпилируйте библиотеку статически.

  • Скомпилируйте библиотеку «динамически» и отправьте файлы библиотеки Allegro вместе с вашей программой. (*.DLL для Windows, *.SO файл «общих объектов» для Linux.) Файлы находятся в том же каталоге, что и исполняемый двоичный файл.

  • Скомпилируйте библиотеку «динамически», как и раньше, но полагайтесь на то, что библиотека уже установлена ​​в системе в системном каталоге. (например, windows\system32)

В первом случае код библиотеки физически добавляется в вашу программу.

Второй футляр и третий футляр идентичны, за исключением того, что вы упаковываете вместе с ним. Ваша программа скомпилирована (но без включенного кода библиотеки Allegro) и ей сказано, что она «найдет» библиотеку после ее запуска. При запуске компоновщик времени выполнения (LD в Linux, запустите man ld для получения дополнительной информации) берет список необходимых символов вашего кода (внешние функции и глобальные переменные), проверяет наличие подходящих соответствующих библиотек в вашем начальном коде. каталог, если нет, проверяет другие системные каталоги.

Второй случай помещает необходимые файлы с вашей программой.

Третий случай зависит от того, что необходимые файлы уже установлены или поставляются с внешним установщиком «время выполнения», что очень часто делает Microsoft. (среды выполнения DirectX, среды выполнения Visual C++ и т. д.)

Итак, поскольку вы нацелены на Linux, вы можете использовать либо первый, либо второй случай. Скомпилируйте конкретную версию Allegro в свой код или отправьте нужную версию вместе с кодом. Преимущества во втором случае заключаются в том, что вы можете изменить файлы DLL/SO позднее без обязательной компиляции (для патча/исправления ошибки), а если у вас есть несколько исполняемых файлов, вам нужен только ОДИН набор библиотечного кода.

Следует отметить, что не все библиотеки позволяют вам (из-за их лицензии) включать двоичные файлы в вашу программу. Вот почему вы часто будете видеть «Распространяемые файлы Microsoft». Однако лицензию Аллегро это не волнует.

person Katastic Voyage    schedule 11.02.2017