Come faccio a compilare e collegamento mediante gnatmake con Ada condiviso biblioteca?

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

  •  29-09-2019
  •  | 
  •  

Domanda

Ho problemi di compilazione un candidato di nuovo la libreria fiorista. Si scopre che ho un problema più grande con Florist (stessi risultati di errore sia da ultimo 2010 AdaCore GPL scaricare e il 2009 la versione nell'archivio di Debian). Fiorista ha alcuni problemi di basso livello, ma quando guardo attraverso i file generati sembra essere compreso errno.h correttamente.

Ecco cosa accade quando costruire fiorista:

gcc-4.4 -c -I / usr / share / ada / adainclude / fiorista demo.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fiorista -I- /usr/share/ada/adainclude/florist/posix.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fiorista -I- /usr/share/ada/adainclude/florist/posix-io.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fiorista -I- /usr/share/ada/adainclude/florist/posix-terminal_functions.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fiorista -I- /usr/share/ada/adainclude/florist/posix-c.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fiorista -I- /usr/share/ada/adainclude/florist/posix-implementation.adb posix-implementation.gpb: 45: 06: avviso: "SYSTEM.INTERRUPT_MANAGEMENT.OPERATIONS" è un'unità interna GNAT POSIX-implementation.gpb: 45: 06: avvertimento: l'uso di questa unità è non portabile e la versione-dipendente posix-implementation.gpb: 47: 06: avviso: "SYSTEM.SOFT_LINKS" è un'unità interna GNAT posix-implementation.gpb: 47: 06: avviso: utilizzo di questa unità non è portatile e dipendente dalla versione gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fiorista -I- /usr/share/ada/adainclude/florist/ada_streams.ads gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fiorista -I- /usr/share/ada/adainclude/florist/posix-permissions.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fiorista -I- /usr/share/ada/adainclude/florist/posix-permissions-implementation.adb gcc-4.4 -c -I./ -I / usr / share / ada / adainclude / fiorista -I- /usr/share/ada/adainclude/florist/posix-process_identification.adb gnatbind -I / usr / share / ada / adainclude / fiorista -x demo.ali gnatlink demo.ali -o demoapp ./posix-implementation.o: In funzione `posix__implementation__set_ada_error_code ': . POSIX-implementation.adb :( testo + 0x19e): undefined reference to `store_errno' ./posix-implementation.o: In funzione `posix__implementation__get_ada_error_code ': . POSIX-implementation.adb :( testo + 0x1ab): undefined reference to `fetch_errno' ./posix-implementation.o: In funzione `posix__implementation__raise_posix_error ': . POSIX-implementation.adb :( testo + 0x234): undefined reference to `fetch_errno' ./posix-implementation.o: In funzione `posix__implementation__check__2' : . POSIX-implementation.adb :( testo + 0x2e5): undefined reference to `fetch_errno' ./posix-implementation.o: In funzione `posix__implementation__check__3' : . POSIX-implementation.adb :( testo + 0x313): undefined reference to `fetch_errno' ./posix-implementation.o: In funzione `posix__implementation__check_nneg ': . POSIX-implementation.adb :( testo + 0x332): undefined reference to `fetch_errno' ./posix-implementation.o:posix-implementation.adb:(.text+0x34e): i riferimenti più indefiniti a seguito `fetch_errno' ./posix-implementation.o: In funzione `nosys_neg_one ': . POSIX-implementation.adb :( testo + 0xaef): undefined reference to `store_errno' ./posix-implementation.o: In funzione `notsup_neg_one ': . POSIX-implementation.adb :( testo + 0xb15): undefined reference to `store_errno' ./posix-implementation.o: In funzione `posix__implementation__restore_signals_and_raise_posix_error ': . POSIX-implementation.adb :( testo + 0xc88): undefined reference to `fetch_errno' ./posix.o: In funzione `posix__system_name ': . Posix.adb :( testo + 0x2f98): undefined reference to `__gnat_florist_uname' ./posix.o: In funzione `posix__node_name ': . Posix.adb :( testo + 0x2fef): undefined reference to `__gnat_florist_uname' ./posix.o: In funzione `posix__release ': . Posix.adb :( testo + 0x3049): undefined reference to `__gnat_florist_uname' ./posix.o: In funzione `posix__version ': . Posix.adb :( testo + 0x30a6): undefined reference to `__gnat_florist_uname' ./posix.o: In funzione `posix__machine ': . Posix.adb :( testo + 0x3103): undefined reference to `__gnat_florist_uname' ./posix.o: In funzione `posix__host_to_network_byte_order ': . Posix.adb :( testo + 0x4627): undefined reference to `c_htonl' ./posix.o: In funzione `posix__host_to_network_byte_order__2' : . Posix.adb :( testo + 0x4642): undefined reference to `c_htons' ./posix.o: In funzione `posix__network_to_host_byte_order ': . Posix.adb :( testo + 0x4655): undefined reference to `c_ntohl' ./posix.o: In funzione `posix__network_to_host_byte_order__2' : . Posix.adb :( testo + 0x4670): undefined reference to `c_ntohs' ./posix-io.o: In funzione `posix__io__open ': . POSIX-io.adb :( testo + 0x4d1): undefined reference to `__gnat_florist_open' ./posix-io.o: In funzione `posix__io__open_or_create ': . POSIX-io.adb :( testo + 0xfca): undefined reference to `__gnat_florist_open' collect2: ld returned 1 exit status gnatlink: errore nel richiamo /usr/bin/gcc-4.4 gnatmake: *** collegamento non riuscito. josh @ mini10: ~ / Demo $ gnatbind -I / usr / share / ada / adainclude / fiorista -I / usr / include demo josh @ mini10: ~ / Demo $ gnatlink demo ./posix-implementation.o: In funzione `posix__implementation__set_ada_error_code ': . POSIX-implementation.adb :( testo + 0x19e): undefined reference to `store_errno' ./posix-implementation.o: In funzione `posix__implementation__get_ada_error_code ': . POSIX-implementation.adb :( testo + 0x1ab): undefined reference to `fetch_errno' ./posix-implementation.o: In funzione `posix__implementation__raise_posix_error ': . POSIX-implementation.adb :( testo + 0x234): undefined reference to `fetch_errno' ./posix-implementation.o: In funzione `posix__implementation__check__2' : . POSIX-implementation.adb :( testo + 0x2e5): undefined reference to `fetch_errno' ./posix-implementation.o: In funzione `posix__implementation__check__3' : . POSIX-implementation.adb :( testo + 0x313): undefined reference to `fetch_errno' ./posix-implementation.o: In funzione `posix__implementation__check_nneg ': . POSIX-implementation.adb :( testo + 0x332): undefined reference to `fetch_errno' ./posix-implementation.o:posix-implementation.adb:(.text+0x34e): i riferimenti più indefiniti a seguito `fetch_errno' ./posix-implementation.o: In funzione `nosys_neg_one ': . POSIX-implementation.adb :( testo + 0xaef): undefined reference to `store_errno' ./posix-implementation.o: In funzione `notsup_neg_one ': . POSIX-implementation.adb :( testo + 0xb15): undefined reference to `store_errno' ./posix-implementation.o: In funzione `posix__implementation__restore_signals_and_raise_posix_error ': . POSIX-implementation.adb :( testo + 0xc88): undefined reference to `fetch_errno' ./posix.o: In funzione `posix__system_name ': . Posix.adb :( testo + 0x2f98): undefined reference to `__gnat_florist_uname' ./posix.o: In funzione `posix__node_name ': . Posix.adb :( testo + 0x2fef): undefined reference to `__gnat_florist_uname' ./posix.o: In funzione `posix__release ': . Posix.adb :( testo + 0x3049): undefined reference to `__gnat_florist_uname' ./posix.o: In funzione `posix__version ': . Posix.adb :( testo + 0x30a6): undefined reference to `__gnat_florist_uname' ./posix.o: In funzione `posix__machine ': . Posix.adb :( testo + 0x3103): undefined reference to `__gnat_florist_uname' ./posix.o: In funzione `posix__host_to_network_byte_order ': . Posix.adb :( testo + 0x4627): undefined reference to `c_htonl' ./posix.o: In funzione `posix__host_to_network_byte_order__2' : . Posix.adb :( testo + 0x4642): undefined reference to `c_htons' ./posix.o: In funzione `posix__network_to_host_byte_order ': . Posix.adb :( testo + 0x4655): undefined reference to `c_ntohl' ./posix.o: In funzione `posix__network_to_host_byte_order__2' : . Posix.adb :( testo + 0x4670): undefined reference to `c_ntohs' ./posix-io.o: In funzione `posix__io__open ': . POSIX-io.adb :( testo + 0x4d1): undefined reference to `__gnat_florist_open' ./posix-io.o: In funzione `posix__io__open_or_create ': . POSIX-io.adb :( testo + 0xfca): undefined reference to `__gnat_florist_open' collect2: ld returned 1 exit status gnatlink: errore quandochiamando /usr/bin/gcc-4.4

Sembra che questo errore è comune se c'è un problema con errno.h essere inclusi in modo corretto. Ma per quanto mi riguarda posso dire dal file POSIX-ç.ç tutto sembra corretto. Qualcuno ha qualche suggerimento su come risolvere questo? make file di Florist costruisce correttamente in modo da non so dove questo sta venendo da.

È stato utile?

Soluzione

OK, questo si è rivelato essere grande dolore, ma ho trovato.

Il Fiorista vincolante è disponibile sia come libreria condivisa e una libreria statica (entrambi sono installati). È necessario collegare alla libreria di risolvere tutti i riferimenti (non potrei mai realmente compilare il sorgente libreria in mia applicazione). Una volta che si passa l'argomento di dire la fase di compilazione sulla libreria è necessario fornire i .ads (almeno) i file per risolvere contro.

La soluzione finale ha finito di essere questo:

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

-aI fornisce il percorso dei file annunci della biblioteca. -aO fornisce il percorso del (in questo caso) libflorist.so file di libreria e, infine, (e questo è quello difficile) si deve passare -lflorist indicare cosa condivisa libreria di tutto questo è ... ma passando non funzionerà . Bisogna mettere un -largs di fronte ad essa (per la compilazione e linker) in modo che la fase di compilazione per essere passato al parametro! Senza di essa quelle fasi non vedono mai l'argomento!

Così ci sono tutti! Per compilare e codice di collegamento contro una libreria condivisa Ada sotto Linux (GCC) è necessario fornire della Biblioteca intestazioni / Spec, la posizione Biblioteca, e l'argomento -llibname insieme ai -largs a passare quelli nei posti giusti!

Sono felice ora. Spero che questo aiuti qualcun altro.

Altri suggerimenti

Questo è un semplice esempio di utilizzo di un progetto GNAT di costruire con fiorista. Suppongo che $ADA_PROJECT_PATH include la directory in cui è installato florist.gpr (nel mio caso, $HOME/local/lib/gnat).

Il programma di esempio (non ho trovato alcun semplici demo Fiorista sul web, ce ne sono?), 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;

Il file di progetto (id.gpr), nella stessa directory id.adb:

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

Build with

$ 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

ed eseguire:

$ ./id
simon

Si presenta come errori di collegamento giardino-varietà graziose. Qualcosa tra i file .h, i tuoi file oggetto Ada, e le vostre librerie di collegamento C non è del tutto l'accoppiamento in su. Difficile da dire che cosa però.

La cosa migliore è andare a essere alla ricerca di altri utenti Fiorista che possono aver eseguito lo stesso problema. La loro pagina del progetto è su SourceForge qui , ma sembra che non è stato orribilmente attiva per gli ultimi 6 anni. Dal momento che l'ultima versione è quella vecchia, potrebbe essere che avete bisogno di un compilatore (e OS?) Quella vecchia per farlo funzionare con. Ick.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top