Interfaçage C- ADA et DLL ADA - Ada - Programmation
Marsh Posté le 17-02-2005 à 08:20:13
Citation : gnatlink: cannot call C:\outils\GNAT95~1\bin\gcc.exe |
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).
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