2016-12-22 4 views
0

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

+0

Проверьте документацию allegro, возможно, они говорят, как упаковать библиотеку вместе с приложениями. – Barmar

+0

Скомпилируйте код в файл ('.o') и свяжите его статически с файлами allegro, возможно, удалив неиспользуемые символы. Это может быть не законным, однако вам следует подумать о том, чтобы прочитать лицензию allegro для получения информации о ее распространении вместе с вашей программой. – ForceBru

+1

https://wiki.allegro.cc/index.php?title=Static_and_Dynamic_Link прочитайте раздел статической ссылки – willll

ответ

1

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

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

  1. Clone исходный код (предположим, вы клонировать его в папку с именем 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 аргумента, чтобы обеспечить компоновщик с дорожкой к статическим библиотекам , которые вы только что создали.

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

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

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, вы можете найти с ним , чтобы найти минимальный набор флагов компоновщика, в котором вы нуждаетесь. Вам потребуется дополнительных флагов компоновщика, если вы подключаетесь к дополнительным модулям. Например, для ссылки на библиотеку PNG для привязки к lallegro_audio-static потребуются флаги, например -lpng.

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

0

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

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

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

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

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

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

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

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

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

Итак, поскольку вы ориентируетесь на Linux, вы можете использовать первый или второй случай. Скомпилируйте свою конкретную версию Allegro в свой код или отправьте версию, которую вы хотите, с кодом. Во втором случае преимущества - это то, что вы можете изменить файлы DLL/SO на более позднюю дату, не обязательно компилируя (для исправления/исправления), и если у вас несколько исполняемых файлов, вам нужен только один набор кода библиотеки.

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

Смежные вопросы