¿Cómo puedo compilación y enlace utilizando gnatmake con una biblioteca compartida de Ada?

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

  •  29-09-2019
  •  | 
  •  

Pregunta

Tengo problemas para compilar un solicitante de nuevo la biblioteca florista. Resulta que tienen un problema más grande con la florista (los mismos resultados de error tanto de descarga más reciente 2010 AdaCore GPL y la versión de 2009 en el archivo de Debian). Floristería tiene algunos problemas de bajo nivel, pero cuando miro a través de los archivos generados parece estar incluidos errno.h correctamente.

Esto es lo que sucede cuando construyo floristería:

gcc-4,4 -c -I / usr / share / ADA / adainclude / florista demo.adb gcc-4.4-c -I./ -I / usr / share / ADA / adainclude / floristería -I- /usr/share/ada/adainclude/florist/posix.adb gcc-4.4-c -I./ -I / usr / share / ADA / adainclude / floristería -I- /usr/share/ada/adainclude/florist/posix-io.adb gcc-4.4-c -I./ -I / usr / share / ADA / adainclude / floristería -I- /usr/share/ada/adainclude/florist/posix-terminal_functions.adb gcc-4.4-c -I./ -I / usr / share / ADA / adainclude / floristería -I- /usr/share/ada/adainclude/florist/posix-c.adb gcc-4.4-c -I./ -I / usr / share / ADA / adainclude / floristería -I- /usr/share/ada/adainclude/florist/posix-implementation.adb posix-implementation.gpb: 45: 06: advertencia: "SYSTEM.INTERRUPT_MANAGEMENT.OPERATIONS" es una unidad de GNAT interna posix-implementation.gpb: 45: 06: advertencia: el uso de esta unidad no es portátil y dependiente de la versión POSIX-implementation.gpb: 47: 06: advertencia: "SYSTEM.SOFT_LINKS" es una unidad interna GNAT POSIX-implementation.gpb: 47: 06: ADVERTENCIA: El uso de esta unidad no es portátil y dependiente de la versión gcc-4.4-c -I./ -I / usr / share / ADA / adainclude / floristería -I- /usr/share/ada/adainclude/florist/ada_streams.ads gcc-4.4-c -I./ -I / usr / share / ADA / adainclude / floristería -I- /usr/share/ada/adainclude/florist/posix-permissions.adb gcc-4.4-c -I./ -I / usr / share / ADA / adainclude / floristería -I- /usr/share/ada/adainclude/florist/posix-permissions-implementation.adb gcc-4.4-c -I./ -I / usr / share / ADA / adainclude / floristería -I- /usr/share/ada/adainclude/florist/posix-process_identification.adb gnatbind -I / usr / share / ADA / adainclude / floristería -x demo.ali gnatlink demo.ali -o DemoApp ./posix-implementation.o: En función `posix__implementation__set_ada_error_code ': . POSIX-implementation.adb :( texto + 0x19e): undefined reference to `store_errno' ./posix-implementation.o: En función `posix__implementation__get_ada_error_code ': . POSIX-implementation.adb :( texto + 0x1ab): undefined reference to `fetch_errno' ./posix-implementation.o: En función `posix__implementation__raise_posix_error ': . POSIX-implementation.adb :( texto + 0x234): undefined reference to `fetch_errno' ./posix-implementation.o: En función `posix__implementation__check__2' : . POSIX-implementation.adb :( texto + 0x2e5): undefined reference to `fetch_errno' ./posix-implementation.o: En función `posix__implementation__check__3' : . POSIX-implementation.adb :( texto + 0x313): undefined reference to `fetch_errno' ./posix-implementation.o: En función `posix__implementation__check_nneg ': . POSIX-implementation.adb :( texto + 0x332): undefined reference to `fetch_errno' ./posix-implementation.o:posix-implementation.adb:(.text+0x34e): referencias más indefinidos Para seguir `fetch_errno' ./posix-implementation.o: En función `nosys_neg_one ': . POSIX-implementation.adb :( texto + 0xaef): undefined reference to `store_errno' ./posix-implementation.o: En función `notsup_neg_one ': . POSIX-implementation.adb :( texto + 0xb15): undefined reference to `store_errno' ./posix-implementation.o: En función `posix__implementation__restore_signals_and_raise_posix_error ': . POSIX-implementation.adb :( texto + 0xc88): undefined reference to `fetch_errno' ./posix.o: En función `posix__system_name ': . Posix.adb :( texto + 0x2f98): undefined reference to `__gnat_florist_uname' ./posix.o: En función `posix__node_name ': . Posix.adb :( texto + 0x2fef): undefined reference to `__gnat_florist_uname' ./posix.o: En función `posix__release ': . Posix.adb :( texto + 0x3049): undefined reference to `__gnat_florist_uname' ./posix.o: En función `posix__version ': . Posix.adb :( texto + 0x30a6): undefined reference to `__gnat_florist_uname' ./posix.o: En función `posix__machine ': . Posix.adb :( texto + 0x3103): undefined reference to `__gnat_florist_uname' ./posix.o: En función `posix__host_to_network_byte_order ': . Posix.adb :( texto + 0x4627): undefined reference to `c_htonl' ./posix.o: En función `posix__host_to_network_byte_order__2' : . Posix.adb :( texto + 0x4642): undefined reference to `c_htons' ./posix.o: En función `posix__network_to_host_byte_order ': . Posix.adb :( texto + 0x4655): undefined reference to `c_ntohl' ./posix.o: En función `posix__network_to_host_byte_order__2' : . Posix.adb :( texto + 0x4670): undefined reference to `c_ntohs' ./posix-io.o: En función `posix__io__open ': . POSIX-io.adb :( texto + 0x4d1): undefined reference to `__gnat_florist_open' ./posix-io.o: En función `posix__io__open_or_create ': . POSIX-io.adb :( texto + 0xfca): undefined reference to `__gnat_florist_open' collect2: ld devolvió el código de salida 1 gnatlink: error al llamar /usr/bin/gcc-4.4 gnatmake: *** enlace falló. Josh @ mini10: ~ / Demostración $ gnatbind -I / usr / share / ADA / adainclude / floristería -I / usr / include demostración Josh @ mini10: ~ / Demostración $ gnatlink demostración ./posix-implementation.o: En función `posix__implementation__set_ada_error_code ': . POSIX-implementation.adb :( texto + 0x19e): undefined reference to `store_errno' ./posix-implementation.o: En función `posix__implementation__get_ada_error_code ': . POSIX-implementation.adb :( texto + 0x1ab): undefined reference to `fetch_errno' ./posix-implementation.o: En función `posix__implementation__raise_posix_error ': . POSIX-implementation.adb :( texto + 0x234): undefined reference to `fetch_errno' ./posix-implementation.o: En función `posix__implementation__check__2' : . POSIX-implementation.adb :( texto + 0x2e5): undefined reference to `fetch_errno' ./posix-implementation.o: En función `posix__implementation__check__3' : . POSIX-implementation.adb :( texto + 0x313): undefined reference to `fetch_errno' ./posix-implementation.o: En función `posix__implementation__check_nneg ': . POSIX-implementation.adb :( texto + 0x332): undefined reference to `fetch_errno' ./posix-implementation.o:posix-implementation.adb:(.text+0x34e): referencias más indefinidos Para seguir `fetch_errno' ./posix-implementation.o: En función `nosys_neg_one ': . POSIX-implementation.adb :( texto + 0xaef): undefined reference to `store_errno' ./posix-implementation.o: En función `notsup_neg_one ': . POSIX-implementation.adb :( texto + 0xb15): undefined reference to `store_errno' ./posix-implementation.o: En función `posix__implementation__restore_signals_and_raise_posix_error ': . POSIX-implementation.adb :( texto + 0xc88): undefined reference to `fetch_errno' ./posix.o: En función `posix__system_name ': . Posix.adb :( texto + 0x2f98): undefined reference to `__gnat_florist_uname' ./posix.o: En función `posix__node_name ': . Posix.adb :( texto + 0x2fef): undefined reference to `__gnat_florist_uname' ./posix.o: En función `posix__release ': . Posix.adb :( texto + 0x3049): undefined reference to `__gnat_florist_uname' ./posix.o: En función `posix__version ': . Posix.adb :( texto + 0x30a6): undefined reference to `__gnat_florist_uname' ./posix.o: En función `posix__machine ': . Posix.adb :( texto + 0x3103): undefined reference to `__gnat_florist_uname' ./posix.o: En función `posix__host_to_network_byte_order ': . Posix.adb :( texto + 0x4627): undefined reference to `c_htonl' ./posix.o: En función `posix__host_to_network_byte_order__2' : . Posix.adb :( texto + 0x4642): undefined reference to `c_htons' ./posix.o: En función `posix__network_to_host_byte_order ': . Posix.adb :( texto + 0x4655): undefined reference to `c_ntohl' ./posix.o: En función `posix__network_to_host_byte_order__2' : . Posix.adb :( texto + 0x4670): undefined reference to `c_ntohs' ./posix-io.o: En función `posix__io__open ': . POSIX-io.adb :( texto + 0x4d1): undefined reference to `__gnat_florist_open' ./posix-io.o: En función `posix__io__open_or_create ': . POSIX-io.adb :( texto + 0xfca): undefined reference to `__gnat_florist_open' collect2: ld devolvió el código de salida 1 gnatlink: error al/usr/bin/gcc-4.4 llamando

Parece que este error es común si hay un problema con errno.h está incluido correctamente. Pero por lo que yo puedo decir por el archivo POSIX-C.C todo parece correcto. Alguien tiene alguna sugerencia sobre cómo resolver esto? make archivo de floristería construye correctamente, así que no sé de dónde viene esto.

¿Fue útil?

Solución

OK, esto resultó ser un gran dolor, pero lo encontré.

La unión Floristería está disponible como una biblioteca compartida y una biblioteca estática (ambos están instalados). Es necesario enlazar con la biblioteca para resolver todas las referencias (que nunca podría en realidad compilar la fuente de la biblioteca en mi aplicación). Una vez que pase el argumento para decir la etapa de compilación de la biblioteca tiene que proporcionar los .ads (al menos) los archivos de resolver en contra.

La solución final terminó siendo esta:

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

-aI proporciona la ruta de acceso a archivos de anuncios de la biblioteca. -aO proporciona la ruta de acceso a la (en este caso) libflorist.so archivo de la biblioteca y, finalmente, (y este es el asunto difícil) tiene que pasar -lflorist para decirle qué biblioteca compartida de todo esto es ... pero que pasa que no funcionará . Usted tiene que colocar una -largs delante de él (para la compilación y el enlazador) con el fin de la fase de compilación que se pasa el parámetro! Sin ella esas fases nunca ven el argumento!

Así que ahí están todos! Con el fin de compilar y código de enlace contra una biblioteca compartida Ada bajo Linux (CCG) es necesario proporcionar los encabezados / especificaciones de la biblioteca, el local de la Biblioteca, y el argumento -llibname junto con los -largs pasar, aquellos en los lugares correctos!

Estoy feliz ahora. Espero que esto ayude a alguien más.

Otros consejos

Este es un ejemplo sencillo de utilizar un proyecto GNAT construir con Floristería. Asumo que $ADA_PROJECT_PATH incluye el directorio donde está instalado florist.gpr (en mi caso, $HOME/local/lib/gnat).

El programa de ejemplo (no pude encontrar ningún demostraciones simples Floristería en la web, ¿hay alguna?), 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;

El archivo de proyecto (id.gpr), en el mismo directorio 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;

Construir con

$ 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

y ejecute:

$ ./id
simon

Parece bastante errores de enlace variedad de jardín. Algo entre sus archivos .h, sus archivos objeto Ada, y sus bibliotecas de enlace C no es bastante apareo. Es difícil de decir lo que sin embargo.

Su mejor apuesta va a estar buscando otros usuarios florista que puede haber topado con el mismo problema. Su página del proyecto es en SourceForge aquí , pero parece que no ha sido horriblemente activo durante los últimos 6 años. Desde la última versión no es tan viejo, podría ser que necesita un compilador (y OS?) Que el viejo para que pueda trabajar con ellos. Ick.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top