2016-12-22 5 views
0

J'ai fait un jeu en utilisant C++ et Allegro 5, ça marche bien sur mon pc avec Linux. Je voudrais savoir comment créer un paquet que je pourrais exporter vers un autre ordinateur Linux, et le faire fonctionner sans installer Allegro. MerciComment faire fonctionner un programme sur d'autres ordinateurs?

+0

Vérifiez la documentation de l'allegro, peut-être qu'ils disent comment empaqueter la bibliothèque avec les applications. – Barmar

+0

Compilez le code dans un fichier d'objet ('.o') et reliez-le statiquement avec les fichiers d'allegro tout en supprimant probablement les symboles inutilisés. Cela peut ne pas être légal, cependant, vous devriez envisager de lire la licence d'allegro pour plus d'informations sur sa distribution à côté de votre programme. – ForceBru

+1

https://wiki.allegro.cc/index.php?title=Static_and_Dynamic_Link lire la section des liens statiques – willll

Répondre

1

Je devais comprendre cela il ya un moment, ce qui suit est un guide basé sur les étapes qui ont fonctionné pour moi. Il peut très bien y avoir un "meilleur" moyen de lier statiquement à allegro.

Pour commencer, vous aurez besoin des bibliothèques statiques pour allegro. Si votre distro ne pas autorisée ceux-ci, vous devrez construire vous-même:

  1. Clone le code source (permet de dire que vous cloner dans un répertoire nommé allegro).
  2. Créer un répertoire de génération: cd allegro && mkdir build && cd build
  3. cmake .. -DSHARED=off. Ceci indique que nous voulons les bibliothèques statiques (non partagées)
  4. make
  5. Vous devriez maintenant voir les bibliothèques se terminant par une extension .a sous lib dans votre répertoire de construction.

Vous pouvez maintenant créer un lien vers les bibliothèques statiques comme ceci:

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

À moins que vous installez les bibliothèques statiques sur votre chemin de la bibliothèque standard (par exemple /usr/lib), vous devez l'argument -L pour fournir l'éditeur de liens avec un chemin d'accès aux bibliothèques statiques que vous venez de créer.

Si vous essayez simplement ce qui précède, vous remarquerez un certain nombre d'erreurs de liens vers d'autres bibliothèques . Lors d'une liaison statique, vous devez spécifier manuellement les indicateurs de liens aux dépendances d'allegro. Pour être honnête, je ne me souviens pas pourquoi c'est, mais Je sais juste que je dois le faire.

Pour déterminer ces dépendances, essayez de construire votre programme une fois avec les bibliothèques partagées :

gcc main.c -o main -lallegro 

Ensuite, exécutez ldd sur le binaire résultant (main). Vous devriez voir quelque chose comme:

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) 

Traduire chacun de ceux-ci dans des drapeaux de l'éditeur de liens, votre commande finale ressemblera:

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

Vous vous remarquerez n'avez pas un lien vers tout dans la sortie de ldd, vous pouvez jouer avec pour trouver un ensemble minimal de drapeaux de liaison dont vous avez besoin. Vous aurez besoin de plus d'indicateurs de liens si vous créez des liens vers des modules supplémentaires. Par exemple, la liaison à lallegro_audio-static nécessitera des indicateurs tels que -lpng pour lier à la bibliothèque PNG .

Finalement, vous trouverez un ensemble de drapeaux qui vous permet de relier statiquement à allegro.Pour vérifier le résultat, exécutez ldd sur votre fichier binaire lié statiquement; doit remarquer que allegro n'est plus inclus dans la sortie, car les utilisateurs n'auront plus besoin de lier dynamiquement à allegro.

0

La réponse pour Allegro est la même pour toute bibliothèque. Cela ne fait rien de spécial. La réponse de l'affiche précédente va dans les détails de mise en œuvre, donc je vais le frapper à partir d'une perspective de 10.000 pieds:

Vous avez trois options pour n'importe quelle bibliothèque.

  • Compilez la bibliothèque de façon statique.

  • Compilez la bibliothèque "dynamiquement" et envoyez les fichiers de bibliothèque Allegro à votre programme. (* .DLL pour Windows, * .SO "objet partagé" fichier pour Linux.) Les fichiers vont dans le même répertoire que le binaire que vous exécutez.

  • Compilez la bibliothèque «dynamiquement», comme ci-dessus, mais comptez sur la bibliothèque déjà installée sur le système dans un répertoire système. (windows \ system32, par exemple)

Dans le premier cas, le code de bibliothèque est physiquement ajouté dans votre programme.

Le deuxième cas et le troisième cas sont identiques sauf ce que vous empaquetez avec. Votre programme est compilé (mais sans le code de la bibliothèque Allegro inclus) et dit qu'il va "trouver" la bibliothèque une fois qu'il est exécuté. Au démarrage, l'éditeur de runtime (LD sous Linux, exécutez man ld pour plus d'informations) prend la liste des symboles requis de votre code (fonctions externes et variables globales), recherche les bibliothèques correspondantes dans votre répertoire de démarrage, sinon, vérifie les autres répertoires du système.

Le deuxième cas met les fichiers requis avec votre programme.

Le troisième cas repose sur l'installation préalable des fichiers requis ou sur l'envoi d'un programme d'installation externe de type «distribution au moment de l'exécution», ce que Microsoft fait très souvent. (Runtime DirectX, Runtime Visual C++, etc.)

Comme vous ciblez Linux, vous pouvez utiliser le premier ou le second cas. Compilez votre version spécifique d'Allegro dans votre code, ou expédiez la version que vous voulez avec votre code. Les avantages dans le deuxième cas, sont que vous pouvez changer les fichiers DLL/SO à une date ultérieure sans nécessairement compiler (pour un patch/bugfix), et si vous avez plusieurs exécutables, vous avez seulement besoin d'un ensemble de code bibliothèque.

Il convient de noter que toutes les bibliothèques ne vous autorisent pas (à cause de leur licence) à inclure les binaires dans votre programme. C'est pourquoi vous verrez souvent les "Microsoft Redistributables". Cependant, la licence d'Allegro ne s'en soucie pas.