Comment puis-je compiler et lien en utilisant la bibliothèque gnatmake avec une Ada partageais?

StackOverflow https://stackoverflow.com/questions/3902597

  •  29-09-2019
  •  | 
  •  

Question

Je ne parviens pas compilez une demande à nouveau la bibliothèque Fleuriste. J'ai avère un problème plus vaste avec Florist (même erreur se produit à la fois le plus récent 2010 AdaCore GPL téléchargement et la version 2009 dans les archives de Debian). Fleuriste a quelques problèmes de bas niveau, mais quand je regarde à travers les fichiers générés, il semble y compris errno.h correctement.

Voici ce qui se passe quand je construis fleuriste:

gcc-4.4 -c -I / usr / share / ada / adainclude / fleuriste demo.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fleuriste -I- /usr/share/ada/adainclude/florist/posix.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fleuriste -I- /usr/share/ada/adainclude/florist/posix-io.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fleuriste -I- /usr/share/ada/adainclude/florist/posix-terminal_functions.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fleuriste -I- /usr/share/ada/adainclude/florist/posix-c.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fleuriste -I- /usr/share/ada/adainclude/florist/posix-implementation.adb posix-implementation.gpb: 45: 06: avertissement: "SYSTEM.INTERRUPT_MANAGEMENT.OPERATIONS" est une unité de GNAT interne posix-implementation.gpb: 45: 06: Avertissement: l'utilisation de cet appareil est non-portable et dépendant de la version posix-implementation.gpb: 47: 06: avertissement: "SYSTEM.SOFT_LINKS" est une unité de GNAT interne posix-implementation.gpb: 47: 06: Avertissement: l'utilisation de cet appareil est non-portable et dépendant de la version gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fleuriste -I- /usr/share/ada/adainclude/florist/ada_streams.ads gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fleuriste -I- /usr/share/ada/adainclude/florist/posix-permissions.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fleuriste -I- /usr/share/ada/adainclude/florist/posix-permissions-implementation.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fleuriste -I- /usr/share/ada/adainclude/florist/posix-process_identification.adb gnatbind -I / usr / share / ada / adainclude / fleuriste -x demo.ali gnatlink demo.ali -o DemoApp ./posix-implementation.o: En fonction `posix__implementation__set_ada_error_code ': . Posix-de implementation.adb :( texte + 0x19e): undefined reference to `store_errno » ./posix-implementation.o: En fonction `posix__implementation__get_ada_error_code ': . Posix-de implementation.adb :( texte + 0x1ab): undefined reference to `fetch_errno » ./posix-implementation.o: En fonction `posix__implementation__raise_posix_error ': . Posix-de implementation.adb :( texte + 0x234): undefined reference to `fetch_errno » ./posix-implementation.o: En fonction `posix__implementation__check__2' : . Posix-de implementation.adb :( texte + 0x2e5): undefined reference to `fetch_errno » ./posix-implementation.o: En fonction `posix__implementation__check__3' : . Posix-de implementation.adb :( texte + 0x313): undefined reference to `fetch_errno » ./posix-implementation.o: En fonction `posix__implementation__check_nneg ': . Posix-de implementation.adb :( texte + 0x332): undefined reference to `fetch_errno » ./posix-implementation.o:posix-implementation.adb:(.text+0x34e): plus de références indéfinies à suivre `fetch_errno » ./posix-implementation.o: En fonction `nosys_neg_one ': . Posix-de implementation.adb :( texte + 0xaef): undefined reference to `store_errno » ./posix-implementation.o: En fonction `notsup_neg_one ': . Posix-de implementation.adb :( texte + 0xb15): undefined reference to `store_errno » ./posix-implementation.o: En fonction `posix__implementation__restore_signals_and_raise_posix_error ': . Posix-de implementation.adb :( texte + 0xc88): undefined reference to `fetch_errno » ./posix.o: En fonction `posix__system_name ': . Posix.adb :( texte + 0x2f98): undefined reference to `__gnat_florist_uname » ./posix.o: En fonction `posix__node_name ': . Posix.adb :( texte + 0x2fef): undefined reference to `__gnat_florist_uname » ./posix.o: En fonction `posix__release ': . Posix.adb :( texte + 0x3049): undefined reference to `__gnat_florist_uname » ./posix.o: En fonction `posix__version ': . Posix.adb :( texte + 0x30a6): undefined reference to `__gnat_florist_uname » ./posix.o: En f`Onction posix__machine ': . Posix.adb :( texte + 0x3103): undefined reference to `__gnat_florist_uname » ./posix.o: En fonction `posix__host_to_network_byte_order ': . Posix.adb :( texte + 0x4627): undefined reference to `c_htonl » ./posix.o: En fonction `posix__host_to_network_byte_order__2' : . Posix.adb :( texte + 0x4642): undefined reference to `c_htons' ./posix.o: En fonction `posix__network_to_host_byte_order ': . Posix.adb :( texte + 0x4655): undefined reference to `c_ntohl » ./posix.o: En fonction `posix__network_to_host_byte_order__2' : . Posix.adb :( texte + 0x4670): undefined reference to `c_ntohs' ./posix-io.o: En fonction `posix__io__open ': . Posix-de io.adb :( texte + 0x4d1): undefined reference to `__gnat_florist_open » ./posix-io.o: En fonction `posix__io__open_or_create ': . Posix-de io.adb :( texte + 0xfca): undefined reference to `__gnat_florist_open » collect2: ld a renvoyé 1 état de sortie gnatlink: Erreur lors de l'appel /usr/bin/gcc-4.4 gnatmake: *** lien a échoué. josh @ mini10: ~ / Demo $ gnatbind -I / usr / share / ada / adainclude / fleuriste -I / usr / include demo josh @ mini10: ~ / Demo $ gnatlink démo ./posix-implementation.o: En fonction `posix__implementation__set_ada_error_code ': . Posix-de implementation.adb :( texte + 0x19e): undefined reference to `store_errno » ./posix-implementation.o: En fonction `posix__implementation__get_ada_error_code ': . Posix-de implementation.adb :( texte + 0x1ab): undefined reference to `fetch_errno » ./posix-implementation.o: En fonction `posix__implementation__raise_posix_error ': . Posix-de implementation.adb :( texte + 0x234): undefined reference to `fetch_errno » ./posix-implementation.o: En fonction `posix__implementation__check__2' : . Posix-de implementation.adb :( texte + 0x2e5): undefined reference to `fetch_errno » ./posix-implementation.o: En fonction `posix__implementation__check__3' : . Posix-de implementation.adb :( texte + 0x313): undefined reference to `fetch_errno » ./posix-implementation.o: En fonction `posix__implementation__check_nneg ': . Posix-de implementation.adb :( texte + 0x332): undefined reference to `fetch_errno » ./posix-implementation.o:posix-implementation.adb:(.text+0x34e): plus de références indéfinies à suivre `fetch_errno » ./posix-implementation.o: En fonction `nosys_neg_one ': . Posix-de implementation.adb :( texte + 0xaef): undefined reference to `store_errno » ./posix-implementation.o: En fonction `notsup_neg_one ': . Posix-de implementation.adb :( texte + 0xb15): undefined reference to `store_errno » ./posix-implementation.o: En fonction `posix__implementation__restore_signals_and_raise_posix_error ': . Posix-de implementation.adb :( texte + 0xc88): undefined reference to `fetch_errno » ./posix.o: En fonction `posix__system_name ': . Posix.adb :( texte + 0x2f98): undefined reference to `__gnat_florist_uname » ./posix.o: En fonction `posix__node_name ': . Posix.adb :( texte + 0x2fef): undefined reference to `__gnat_florist_uname » ./posix.o: En fonction `posix__release ': . Posix.adb :( texte + 0x3049): undefined reference to `__gnat_florist_uname » ./posix.o: En fonction `posix__version ': . Posix.adb :( texte + 0x30a6): undefined reference to `__gnat_florist_uname » ./posix.o: En fonction `posix__machine ': . Posix.adb :( texte + 0x3103): undefined reference to `__gnat_florist_uname » ./posix.o: En fonction `posix__host_to_network_byte_order ': . Posix.adb :( texte + 0x4627): undefined reference to `c_htonl » ./posix.o: En fonction `posix__host_to_network_byte_order__2' : . Posix.adb :( texte + 0x4642): undefined reference to `c_htons' ./posix.o: En fonction `posix__network_to_host_byte_order ': . Posix.adb :( texte + 0x4655): undefined reference to `c_ntohl » ./posix.o: En fonction `posix__network_to_host_byte_order__2' : . Posix.adb :( texte + 0x4670): undefined reference to `c_ntohs' ./posix-io.o: En fonction `posix__io__open ': . Posix-de io.adb :( texte + 0x4d1): undefined reference to `__gnat_florist_open » ./posix-io.o: En fonction `posix__io__open_or_create ': . Posix-de io.adb :( texte + 0xfca): undefined reference to `__gnat_florist_open » collect2: ld a renvoyé 1 état de sortie gnatlink: erreur lorsqueappelant /usr/bin/gcc-4.4

Il semble que cette erreur est commune s'il y a un problème avec errno.h étant inclus correctement. Mais pour autant que je peux dire à partir du fichier posix-C.C tout semble correct. Quelqu'un at-il des suggestions sur la façon de résoudre ce problème? Le fichier make de fleuriste construit correctement, donc je ne sais pas où cela vient.

Était-ce utile?

La solution

OK, cela se révèle être grande douleur, mais je l'ai trouvé.

La liaison Livraison est disponible à la fois comme une bibliothèque partagée et une bibliothèque statique (les deux sont installés). Vous devez lier à la bibliothèque pour résoudre toutes les références (je ne pourrais jamais compiler en fait la source bibliothèque dans mon application). Une fois que vous passez l'argument de dire la phase de compilation de la bibliothèque, vous devez fournir les fichiers .ads (au moins) pour résoudre contre.

La solution finale étant terminée ceci:

gnatmake -aI/usr/share/ada/adainclude/florist -aO/usr/lib/ada/adalib/florist demo.adb -largs -lflorist

-aI fournit le chemin d'accès aux fichiers annonces de la bibliothèque. -aO fournit le chemin du (dans ce cas) libflorist.so fichier de bibliothèque et enfin (ce qui est une délicate) vous devez passer -lflorist pour lui dire quelle bibliothèque partagée est tout cela ... mais passer ça ne marchera pas . Vous devez placer un -largs devant lui (pour la compilation et de liaison) pour que la phase de compilation à passer le paramètre! Sans elle ces phases ne voient jamais l'argument!

Alors, vous y êtes tout le monde! Pour compiler et le code de lien avec une bibliothèque Ada partagée sous Linux (GCC), vous devez fournir les en-têtes / spécifications, l'emplacement de la bibliothèque de la bibliothèque, et l'argument -llibname ainsi que les -largs passer ceux dans les bons endroits!

Je suis heureux maintenant. Espérons que cela aide quelqu'un d'autre.

Autres conseils

Ceci est un exemple simple d'utilisation d'un projet GNAT construire avec Fleuriste. Je suppose que $ADA_PROJECT_PATH comprend le répertoire où florist.gpr est installé (dans mon cas, $HOME/local/lib/gnat).

Le programme d'échantillonnage (je ne pouvais pas trouver des simples démos Florist sur le web, y at-il?), En id.adb:

with POSIX.Process_Identification;
with Ada.Text_IO; use Ada.Text_IO;
procedure Id is
begin
   Put_Line (POSIX.To_String (POSIX.Process_Identification.Get_Login_Name));
end Id;

Le fichier de projet (id.gpr), dans le même répertoire que id.adb:

with "florist";
project Id is
   for Main use ("id.adb");
   for Object_Dir use ".build_id";
   for Exec_Dir use ".";
end Id;

Construire avec

$ gnatmake -p -P id.gpr
object directory "/Users/simon/florist-gpl-2010-src/demo/.build_id" created for project id
gcc -c -I- -gnatA /Users/simon/florist-gpl-2010-src/demo/id.adb
gnatbind -I- -x /Users/simon/florist-gpl-2010-src/demo/.build_id/id.ali
gnatlink /Users/simon/florist-gpl-2010-src/demo/.build_id/id.ali -lflorist -o /Users/simon/florist-gpl-2010-src/demo/id

et exécutez:

$ ./id
simon

Il ressemble à des erreurs jolies lien-variété de jardin. Quelque chose entre vos fichiers .h, vos fichiers objet Ada, et vos bibliothèques de liens C est pas tout à fait en place des amours. Difficile de dire ce que.

Votre meilleur pari va être à la recherche d'autres utilisateurs fleuriste qui peuvent avoir fait le même problème. Leur page du projet est sur SourceForge , mais il semble que cela n'a pas été horriblement actif pour les 6 dernières années. Depuis la dernière version il y a ce vieux, il se pourrait que vous avez besoin d'un compilateur (et OS?) Ce vieux pour elle de travailler avec. Ick.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top