Interfaçage C- ADA et DLL ADA

Interfaçage C- ADA et DLL ADA - Ada - Programmation

Marsh Posté le 17-02-2005 à 08:04:12    

Je travaille avec GNAT95 version 3.14p sous WINDOWS NT.
 
J'essaie de réaliser une DLL en ADA qui contient dans une de ses fonctions un appel à une fonction écrite en C.
J'ai donc réaliser un package. Pour information, dans une procédure main, j'ai déjà réussi à importer une fonction C
et aussi, j'ai déjà réussie à réaliser à partir d'un package ADA une DLL que je peux ensuite utiliser avec d'autres programmes ADA ou C. Mais, associer les 2 me posent un problème.
 
Le problème est que le compilateur ADA ne trouve pas la fonction C "long_message" que je veux utiliser dans ma fonction ADA "init_sw_start" qui se trouve dans le package API.
Si je réalise un package API, c'est parce que, par la suite, je désire réaliser une DLL à partir de celui en exportant mes
fonctions init_sw_start (et Initialize_API, Finalize_API utilisés pour créer une DLL en ADA).
Je fais bien une déclaration et une importation de la fonction C "long_message" dans le fichier API.ads.
 
J'ai essayé 2 possibilités :
1) à partir de la création d'une DLL de mon fichier test1.c ==> il ne trouve pas la fonction long_message lors du link avec la DLL
2) en essayant de faire la liaison, dans la compilation, entre mon .ali et du .o provenant de mon fichier C : cf le message d'erreur de la compil
 
 
Voici le contenu de mes fichiers :
main.c
------
#include "test1.h"
 
extern void adainit (void);  
extern void adafinal (void);
extern int init_sw_start;
 
int main ()
{
  adainit ();
  init_sw_start;
  adafinal ();
}
 
------------------------------------------------------------------------------------------------------
test1.c
-------
#include <stdio.h>
#include <string.h>
#include "test1.h"
 
int long_message(char *message)
{
int long_mess = strlen(message);
printf("passage dans long_message" );
        return(long_mess);
}
 
---------------------------------------------------------------------------------------------------------
test1.h
-------
int long_message(char *message);
 
---------------------------------------------------------------------------------------------------------
api.ads
-------
with Interfaces.C; use Interfaces;
package API is
   
   function init_sw_start return C.int;
 
   procedure Initialize_API;
   procedure Finalize_Api;
   
   function Long_Message (Chaine : in C.Char_Array) return Integer;
 
   --  Initialization & Finalization routines. More in the next section.
private
   pragma Export (C, Initialize_API);
   pragma Export (C, Finalize_API);
   pragma Export (C, Init_Sw_Start);
   
   pragma Import(C, Long_Message, "long_message" );
 
end API;
 
---------------------------------------------------------------------------------------------------------
api.adb
-------
with Interfaces.C; use Interfaces.C;
with text_io;
 
package body API is
   function init_sw_start return C.int is
      Long_Str : Integer;
   begin
     
     te                              xt_io.put  
     Long_Str := Long_Message("hello" & C.nul);
     return C.int(Long_Str);
       
   end init_sw_start;
 
   procedure Initialize_API is
      procedure Adainit;
      pragma Import (C, Adainit);
   begin
      Adainit;
   end Initialize_API;
 
   procedure Finalize_API is
      procedure Adafinal;
      pragma Import (C, Adafinal);
   begin
      Adafinal;
   end Finalize_API;
end API;
 
---------------------------------------------------------------------------------------------------------
fichier API.def pour l'exportation des fonctions ADA:
----------------------------------------------------
EXPORTS
    init_sw_start
    finalize_api
    initialize_api
 
 
---------------------------------------------------------------------------------------------------------
Le fichier de compil "compil.bat" pour la 2eme possibilité que j'ai essayé:
--------------------------------------------------------------
 
@ECHO OFF
 
echo COMPILATION DU PROGRAMME C :
gcc -c test1.c
gcc -c main.c
 
gnatmake -c api
gnatbind -n api
gnatlink api -o main --LINK=C:\outils\gnat95_314\bin\gcc test1.o main.o
 
 
echo CREATION DE LA DLL :
gnatdll -d api.dll api.ali
 
echo CREATION DE LA LIBRAIRIE :
lib -machine:IX86 -def:api.def -out:api.lib
 
---------------------------------------------------------------------------------------------------------
Voici l'erreur issue de la compilation:
---------------------------------------
 
COMPILATION DU PROGRAMME C :
1
2
gcc -c api.adb
3
4
CREATION DE LA DLL :
Building relocatable DLL...
make api.dll and libapi.a
./api.o(.text+0x14):api.adb: undefined reference to `long_message'
gnatlink: cannot call C:\outils\GNAT95~1\bin\gcc.exe
gnatlink execution error.
CREATION DE LA LIBRAIRIE :
Le nom spécifié n'est pas reconnu comme étant une commande interne
ou externe, un programme exécutable ou un fichier de commandes.
 
 
Merci d'avance pour votre aide :)

Reply

Marsh Posté le 17-02-2005 à 08:04:12   

Reply

Marsh Posté le 17-02-2005 à 08:20:13    

Citation :

gnatlink: cannot call C:\outils\GNAT95~1\bin\gcc.exe
gnatlink execution error.
CREATION DE LA LIBRAIRIE :
Le nom spécifié n'est pas reconnu comme étant une commande interne
ou externe, un programme exécutable ou un fichier de commandes.


euh c'est pas tout simplement le fait que tu n'as pas installé correctement gnat et gcc.
Y a une erreur de PATH (il faut faire en sorte que le système sache où se trouve gcc en renseignant les variables du shell).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed