Я сделал игру, используя C++ и Allegro 5, она отлично работает на моем компьютере с Linux. Я хотел бы знать, как создать пакет, который я мог бы экспортировать на другой компьютер с Linux, и заставить его работать без установки Allegro. Спасибо
Как заставить программу работать на других компьютерах?
Ответы (2)
Я должен был понять это некоторое время назад, далее следует руководство, основанное на шагах, которые сработали для меня. Вполне может быть «лучший» способ статической ссылки на аллегро.
Для начала вам понадобятся статические библиотеки для allegro. Если в вашем дистрибутиве их нет, вам придется собрать их самостоятельно:
- Клонируйте исходный код (скажем, вы клонируете его в каталог с именем
allegro
). - Создайте каталог сборки:
cd allegro && mkdir build && cd build
cmake .. -DSHARED=off
. Это указывает, что нам нужны статические (не общие) библиотеки.make
- Теперь вы должны увидеть библиотеки, заканчивающиеся расширением
.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.
Ответ для Allegro одинаков для любой библиотеки. Это не делает ничего особенного. Ответ предыдущего автора касается деталей реализации, поэтому я расскажу об этом с точки зрения 10 000 футов:
У вас есть три варианта для ЛЮБОЙ библиотеки.
Скомпилируйте библиотеку статически.
Скомпилируйте библиотеку «динамически» и отправьте файлы библиотеки Allegro вместе с вашей программой. (*.DLL для Windows, *.SO файл «общих объектов» для Linux.) Файлы находятся в том же каталоге, что и исполняемый двоичный файл.
Скомпилируйте библиотеку «динамически», как и раньше, но полагайтесь на то, что библиотека уже установлена в системе в системном каталоге. (например, windows\system32)
В первом случае код библиотеки физически добавляется в вашу программу.
Второй футляр и третий футляр идентичны, за исключением того, что вы упаковываете вместе с ним. Ваша программа скомпилирована (но без включенного кода библиотеки Allegro) и ей сказано, что она «найдет» библиотеку после ее запуска. При запуске компоновщик времени выполнения (LD в Linux, запустите man ld для получения дополнительной информации) берет список необходимых символов вашего кода (внешние функции и глобальные переменные), проверяет наличие подходящих соответствующих библиотек в вашем начальном коде. каталог, если нет, проверяет другие системные каталоги.
Второй случай помещает необходимые файлы с вашей программой.
Третий случай зависит от того, что необходимые файлы уже установлены или поставляются с внешним установщиком «время выполнения», что очень часто делает Microsoft. (среды выполнения DirectX, среды выполнения Visual C++ и т. д.)
Итак, поскольку вы нацелены на Linux, вы можете использовать либо первый, либо второй случай. Скомпилируйте конкретную версию Allegro в свой код или отправьте нужную версию вместе с кодом. Преимущества во втором случае заключаются в том, что вы можете изменить файлы DLL/SO позднее без обязательной компиляции (для патча/исправления ошибки), а если у вас есть несколько исполняемых файлов, вам нужен только ОДИН набор библиотечного кода.
Следует отметить, что не все библиотеки позволяют вам (из-за их лицензии) включать двоичные файлы в вашу программу. Вот почему вы часто будете видеть «Распространяемые файлы Microsoft». Однако лицензию Аллегро это не волнует.
.o
) файл и статически свяжите его с файлами allegro, возможно, удалив неиспользуемые символы. Это может быть незаконным, однако вам следует прочитать лицензию allegro для получения информации о его распространении вместе с вашей программой. - person ForceBru   schedule 22.12.2016