Wie kann ich kompilieren und verknüpfen mit einem Ada mit gnatmake Shared Library?

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

  •  29-09-2019
  •  | 
  •  

Frage

Ich habe Probleme beim Kompilieren eines Antragstellers erneut die Florist Bibliothek. Stellt sich heraus, ich habe ein größeres Problem mit Floristen (gleiche Fehler resultiert aus beiden neuesten 2010 AdaCore GPL Download und 2009 Version in Debian-Archiv). Florist hat einige Low-Level-Probleme, aber wenn ich die generierten Dateien durchschauen scheint es errno.h richtig zu sein, einschließlich.

Hier ist, was passiert, wenn ich bauen Floristin:

gcc-4.4 -c -I / usr / share / ada / adainclude / Floristin demo.adb gcc-4.4-c -I./ -I / usr / share / ada / adainclude / Floristin -I- /usr/share/ada/adainclude/florist/posix.adb gcc-4.4-c -I./ -I / usr / share / ada / adainclude / Floristin -I- /usr/share/ada/adainclude/florist/posix-io.adb gcc-4.4-c -I./ -I / usr / share / ada / adainclude / Floristin -I- /usr/share/ada/adainclude/florist/posix-terminal_functions.adb gcc-4.4-c -I./ -I / usr / share / ada / adainclude / Floristin -I- /usr/share/ada/adainclude/florist/posix-c.adb gcc-4.4-c -I./ -I / usr / share / ada / adainclude / Floristin -I- /usr/share/ada/adainclude/florist/posix-implementation.adb POSIX-implementation.gpb: 45: 06: Warnung: "SYSTEM.INTERRUPT_MANAGEMENT.OPERATIONS" ist eine interne Einheit GNAT Posix-implementation.gpb: 45: 06: Warnung: Verwendung dieses Geräts ist nicht tragbar und versionsabhängig POSIX-implementation.gpb: 47: 06: Warnung: "SYSTEM.SOFT_LINKS" ist eine interne Einheit GNAT Posix-implementation.gpb: 47: 06: Warnung: Verwendung dieses Geräts ist nicht tragbar und versionsabhängig gcc-4.4-c -I./ -I / usr / share / ada / adainclude / Floristin -I- /usr/share/ada/adainclude/florist/ada_streams.ads gcc-4.4-c -I./ -I / usr / share / ada / adainclude / Floristin -I- /usr/share/ada/adainclude/florist/posix-permissions.adb gcc-4.4-c -I./ -I / usr / share / ada / adainclude / Floristin -I- /usr/share/ada/adainclude/florist/posix-permissions-implementation.adb gcc-4.4-c -I./ -I / usr / share / ada / adainclude / Floristin -I- /usr/share/ada/adainclude/florist/posix-process_identification.adb gnatbind -I / usr / share / ada / adainclude / Floristin -x demo.ali gnatlink demo.ali -o DemoApp ./posix-implementation.o: In Funktion `posix__implementation__set_ada_error_code ': . Posix-implementation.adb :( text + 0x19e): undefined reference to `store_errno‘ ./posix-implementation.o: In Funktion `posix__implementation__get_ada_error_code ': . Posix-implementation.adb :( text + 0x1ab): undefined reference to `fetch_errno‘ ./posix-implementation.o: In Funktion `posix__implementation__raise_posix_error ': . Posix-implementation.adb :( text + 0x234): undefined reference to `fetch_errno‘ ./posix-implementation.o: In Funktion `posix__implementation__check__2' : . Posix-implementation.adb :( text + 0x2e5): undefined reference to `fetch_errno‘ ./posix-implementation.o: In Funktion `posix__implementation__check__3' : . Posix-implementation.adb :( text + 0x313): undefined reference to `fetch_errno‘ ./posix-implementation.o: In Funktion `posix__implementation__check_nneg ': . Posix-implementation.adb :( text + 0x332): undefined reference to `fetch_errno‘ ./posix-implementation.o:posix-implementation.adb:(.text+0x34e): mehr undefinierte Verweise auf `fetch_errno Follow ./posix-implementation.o: In Funktion `nosys_neg_one ': . Posix-implementation.adb :( text + 0xaef): undefined reference to `store_errno‘ ./posix-implementation.o: In Funktion `notsup_neg_one ': . Posix-implementation.adb :( text + 0xb15): undefined reference to `store_errno‘ ./posix-implementation.o: In Funktion `posix__implementation__restore_signals_and_raise_posix_error ': . Posix-implementation.adb :( text + 0xc88): undefined reference to `fetch_errno‘ ./posix.o: In Funktion `posix__system_name ': . Posix.adb :( Text + 0x2f98): undefined reference to `__gnat_florist_uname‘ ./posix.o: In Funktion `posix__node_name ': . Posix.adb :( Text + 0x2fef): undefined reference to `__gnat_florist_uname‘ ./posix.o: In Funktion `posix__release ': . Posix.adb :( Text + 0x3049): undefined reference to `__gnat_florist_uname‘ ./posix.o: In Funktion `posix__version ': . Posix.adb :( Text + 0x30a6): undefined reference to `__gnat_florist_uname‘ ./posix.o: In fSalbung `posix__machine ': . Posix.adb :( Text + 0x3103): undefined reference to `__gnat_florist_uname‘ ./posix.o: In Funktion `posix__host_to_network_byte_order ': . Posix.adb :( Text + 0x4627): undefined reference to `c_htonl‘ ./posix.o: In Funktion `posix__host_to_network_byte_order__2' : . Posix.adb :( Text + 0x4642): undefined reference to `c_htons' ./posix.o: In Funktion `posix__network_to_host_byte_order ': . Posix.adb :( Text + 0x4655): undefined reference to `c_ntohl‘ ./posix.o: In Funktion `posix__network_to_host_byte_order__2' : . Posix.adb :( Text + 0x4670): undefined reference to `c_ntohs' ./posix-io.o: In Funktion `posix__io__open ': . Posix-io.adb :( text + 0x4d1): undefined reference to `__gnat_florist_open‘ ./posix-io.o: In Funktion `posix__io__open_or_create ': . Posix-io.adb :( text + 0xfca): undefined reference to `__gnat_florist_open‘ collect2: ld ergab 1 Exit-Status gnatlink: Fehler beim Aufruf /usr/bin/gcc-4.4 gnatmake: *** Link fehlgeschlagen. josh @ Mini10: ~ / Demo $ gnatbind -I / usr / share / ada / adainclude / Floristin -I / usr / include Demo josh @ Mini10: ~ / Demo $ gnatlink Demo ./posix-implementation.o: In Funktion `posix__implementation__set_ada_error_code ': . Posix-implementation.adb :( text + 0x19e): undefined reference to `store_errno‘ ./posix-implementation.o: In Funktion `posix__implementation__get_ada_error_code ': . Posix-implementation.adb :( text + 0x1ab): undefined reference to `fetch_errno‘ ./posix-implementation.o: In Funktion `posix__implementation__raise_posix_error ': . Posix-implementation.adb :( text + 0x234): undefined reference to `fetch_errno‘ ./posix-implementation.o: In Funktion `posix__implementation__check__2' : . Posix-implementation.adb :( text + 0x2e5): undefined reference to `fetch_errno‘ ./posix-implementation.o: In Funktion `posix__implementation__check__3' : . Posix-implementation.adb :( text + 0x313): undefined reference to `fetch_errno‘ ./posix-implementation.o: In Funktion `posix__implementation__check_nneg ': . Posix-implementation.adb :( text + 0x332): undefined reference to `fetch_errno‘ ./posix-implementation.o:posix-implementation.adb:(.text+0x34e): mehr undefinierte Verweise auf `fetch_errno Follow ./posix-implementation.o: In Funktion `nosys_neg_one ': . Posix-implementation.adb :( text + 0xaef): undefined reference to `store_errno‘ ./posix-implementation.o: In Funktion `notsup_neg_one ': . Posix-implementation.adb :( text + 0xb15): undefined reference to `store_errno‘ ./posix-implementation.o: In Funktion `posix__implementation__restore_signals_and_raise_posix_error ': . Posix-implementation.adb :( text + 0xc88): undefined reference to `fetch_errno‘ ./posix.o: In Funktion `posix__system_name ': . Posix.adb :( Text + 0x2f98): undefined reference to `__gnat_florist_uname‘ ./posix.o: In Funktion `posix__node_name ': . Posix.adb :( Text + 0x2fef): undefined reference to `__gnat_florist_uname‘ ./posix.o: In Funktion `posix__release ': . Posix.adb :( Text + 0x3049): undefined reference to `__gnat_florist_uname‘ ./posix.o: In Funktion `posix__version ': . Posix.adb :( Text + 0x30a6): undefined reference to `__gnat_florist_uname‘ ./posix.o: In Funktion `posix__machine ': . Posix.adb :( Text + 0x3103): undefined reference to `__gnat_florist_uname‘ ./posix.o: In Funktion `posix__host_to_network_byte_order ': . Posix.adb :( Text + 0x4627): undefined reference to `c_htonl‘ ./posix.o: In Funktion `posix__host_to_network_byte_order__2' : . Posix.adb :( Text + 0x4642): undefined reference to `c_htons' ./posix.o: In Funktion `posix__network_to_host_byte_order ': . Posix.adb :( Text + 0x4655): undefined reference to `c_ntohl‘ ./posix.o: In Funktion `posix__network_to_host_byte_order__2' : . Posix.adb :( Text + 0x4670): undefined reference to `c_ntohs' ./posix-io.o: In Funktion `posix__io__open ': . Posix-io.adb :( text + 0x4d1): undefined reference to `__gnat_florist_open‘ ./posix-io.o: In Funktion `posix__io__open_or_create ': . Posix-io.adb :( text + 0xfca): undefined reference to `__gnat_florist_open‘ collect2: ld ergab 1 Exit-Status gnatlink: Fehler, wennAufruf /usr/bin/gcc-4.4

Es scheint, dass dieser Fehler üblich ist, wenn es ein Problem mit errno.h ist richtig einbezogen werden. Aber so weit wie kann ich aus der Datei Posix-C.C sagen, es sieht alles korrigieren. Jedes hat Vorschläge, wie dieses Problem zu lösen? Florist Make-Datei erstellt richtig, damit ich weiß nicht, wo das herkommt.

War es hilfreich?

Lösung

OK, dies erwies sich als großer Schmerz zu sein, aber ich habe es gefunden.

Der Florist Bindung ist sowohl als gemeinsam genutzte Bibliothek und eine statische Bibliothek (beide installiert sind). Sie müssen gegen die Bibliothek verknüpfen alle Verweise aufzulösen (konnte ich nie wirklich die Bibliothek Quelle in meine Anwendung kompilieren). Sobald Sie das Argument zu sagen, die Kompilierungsphase über die Bibliothek übergeben müssen Sie die .ads liefern (mindestens) Dateien zu lösen, gegen.

Die endgültige Lösung beendet wobei dies:

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

-aI stellt den Pfad zum Anzeigen von Dateien der Bibliothek. -aO gibt den Pfad zu dem (in diesem Fall) libflorist.so Bibliotheksdatei und schließlich (und das ist die knifflige Frage) Sie haben -lflorist passieren, ihm zu sagen, was Bibliothek geteilt dies alles ist ... aber vorbei es wird nicht funktionieren . Sie haben eine -largs vor ihm Platz (für die Kompilierung und Linker), um für die Übersetzungsphase, um die Parameter übergeben werden! Ohne sie diese Phasen sehen nie das Argument!

Da sind Sie ja jeder! Um zu kompilieren und Link-Code gegen eine gemeinsamen Ada-Bibliothek unter Linux (GCC) haben Sie die Library Headers / Specs, die Bibliothek Lage, und das -llibname Argument zusammen mit dem -largs zur Verfügung stellen müssen diese in die richtigen Stellen passieren!

Ich bin jetzt glücklich. Hoffe, das hilft jemand anderes.

Andere Tipps

Dies ist ein einfaches Beispiel eines GNAT-Projekt zu erstellen mit Blumenhändlern zu verwenden. Ich gehe davon aus, dass $ADA_PROJECT_PATH das Verzeichnis enthält, in dem florist.gpr installiert ist (in meinem Fall $HOME/local/lib/gnat).

Das Beispielprogramm (ich konnte keine einfache Blumen Demos im Web finden, gibt es überhaupt?), In 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;

Die Projektdatei (id.gpr), im selben Verzeichnis wie id.adb:

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

Bauen mit

$ 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

und Lauf:

$ ./id
simon

Es sieht aus wie ziemlich Garten-Sorte Link Fehler. Etwas zwischen H-Dateien, Ihre Ada Objektdateien und Ihre C Link Libraries ist nicht ganz Paarung auf. Schwer zu sagen, was aber.

Ihre beste Wette wird für andere Florist Benutzer zu suchen, die in das gleiche Problem laufen haben. Ihre Projektseite ist auf Source hier , aber es sieht aus wie es schrecklich nicht gewesen aktiv für die letzten 6 Jahre. Seit der letzten Version ist es, dass alte, könnte es sein, dass Sie einen Compiler benötigen (und OS?), Dass alte für sie zu arbeiten. Ick.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top