Bonjour, je souhaiterais savoir s'il est possible d'utiliser une bibliothèque écrite avec Ada avec C et si oui comment ?
Merci pour vos réponse, je n'ai pas su trouver sur le net.
Bonjour, je souhaiterais savoir s'il est possible d'utiliser une bibliothèque écrite avec Ada avec C et si oui comment ?
Merci pour vos réponse, je n'ai pas su trouver sur le net.
Re-
J'ai avancé mais j'ai un problème.
J'ai d'abord une bibliothèque racine écrite avec Ada : gene.ads gene.adb
J'utilise cette bibliothèque pour présenter un service : genetic.ads genetic.adb avec l'exportation d'un procedure pour le langage C.
Code ada : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 package Gene is pragma Linker_Options ("-lgene"); .../... end Gene;
Code ada : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 with Gene; package Genetic is pragma Linker_Options ("-lgenetic"); .../... procedure Genesis(New_Gene : Boolean; Total_Gene : Boolean; List_Mode : Boolean); pragma Export (C, Genesis, "genesis"); end Genetic;
Mon ficher d'entête C :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 /* gene_genetic.h */ #include <stdbool.h> extern void genesis (bool new_gene, bool total_gene, bool list_mode);
Mon fichier principal écrit avec C :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #include <stdbool.h> #include "gene_genetic.h" int main (int argc, char *argv[]) { genesis (true, true, true); return 0; }
Et mon Makefile :
Et tout ce passe jusqu'à la liste des référence indéfinies d'appel à Ada libgene.so et libgenetic.so.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 .PHONY: cgenesis gene genetic gene: gnatmake -c lib/gene.adb gnatbind -Lgene gene -aIlib -static gnatmake -C b~gene.adb ar rc gene.a b~gene.o gcc -shared -o libgene.so *.o -static # chmod -w lib/*.ali genetic: gnatmake -c lib/genetic.adb gnatbind -Lgenetic genetic -aIlib -static gnatmake -C b~genetic.adb ar rc genetic.a b~genetic.o gcc -shared -o libgenetic.so *.o -static # chmod -w lib/*.ali cgenesis: gcc main.c -o cgenesis -L. -lgene -lgenetic clean: rm *.ali *.o mrproper: rm *~ *.so
Appel de make :
Début du résultat :$ make gene && make genetic && make cgenesis
Je suis pas loin mais comme je ne connais que peu de chose avec C, je suis paumé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 gnatmake -c lib/gene.adb gcc-4.6 -c -Ilib/ -I- lib/gene.adb gnatbind -Lgene gene -aIlib -static gnatmake -C b~gene.adb gcc-4.6 -c -gnatem=/home/manuel/2015Projects/Ada/Genetic/GNAT-TEMP-000001.TMP b~gene.adb ar rc gene.a b~gene.o gcc -shared -o libgene.so *.o -static gnatmake -c lib/genetic.adb gcc-4.6 -c -Ilib/ -I- lib/genetic.adb genetic.ads:28:22: warning: "Genesis.New_Gene" is an 8-bit Ada Boolean genetic.ads:28:22: warning: use appropriate corresponding type in C (e.g. char) genetic.ads:29:22: warning: "Genesis.Total_Gene" is an 8-bit Ada Boolean genetic.ads:29:22: warning: use appropriate corresponding type in C (e.g. char) genetic.ads:30:22: warning: "Genesis.List_Mode" is an 8-bit Ada Boolean genetic.ads:30:22: warning: use appropriate corresponding type in C (e.g. char) gnatbind -Lgenetic genetic -aIlib -static gnatmake -C b~genetic.adb gcc-4.6 -c -gnatem=/home/manuel/2015Projects/Ada/Genetic/GNAT-TEMP-000001.TMP b~genetic.adb ar rc genetic.a b~genetic.o gcc -shared -o libgenetic.so *.o -static gcc main.c -o cgenesis -L. -lgene -lgenetic ./libgenetic.so: undefined reference to `system__random_numbers___elabb' ./libgene.so: undefined reference to `interfaces__c_E' ./libgenetic.so: undefined reference to `gnat__directory_operations_E' ./libgene.so: undefined reference to `system__standard_library__adafinal' ./libgenetic.so: undefined reference to `ada__strings__maps_E' .../... Etc collect2: error: ld returned 1 exit status make: *** [cgenesis] Erreur 1
Je voudrais que les utilisateur de C puisse utiliser ma bibliothèque.
Je sais que ce n'est pas tout a fait conforme comme export mais pour l'exemple de chaîne de production de logiciel, je sèche.
J'ai rajouté l'option -lgnat, ça va mieux, par contre je ne sais pas si c'est normal.
Mon Makefile :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 .PHONY: gene genetic cgenesis all: gene genetic cgenesis gene: gcc-4.6 -c -g -O2 gene.adb gcc-4.6 -c -g -O2 genetic.adb gcc-4.6 -c -g -O2 adamain.adb gnatmake adamain.adb rm adamain.o adamain.ali gnatbind -n -Lgene gene ar rc gene.a gene.o gcc -shared -o libgene.so *.o genetic: gnatbind -n -Lgenetic genetic gnatmake -c genetic.adb ar cr genetic.a genetic.o gene.o gcc -shared -o libgenetic.so *.o cgenesis: gcc-4.6 -c main.c gnatbind gene.ali genetic.ali -o b__main.adb -n gcc-4.6 -c b__main.adb -lgnat-4.6 \ -L. -L/usr/lib/gcc/i486-linux-gnu/4.6/adalib/ \ -shared -shared-libgcc ar cr libdefault.a *.o ranlib libdefault.a gcc-4.6 main.o -o cgenesis -lgnat-4.6 \ -L. -L/usr/lib/gcc/i486-linux-gnu/4.6/adalib/ \ -shared -shared-libgcc
Partager