IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Comment utiliser une bibliothèque Ada en C ?


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Comment utiliser une bibliothèque Ada en C ?
    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.

  2. #2
    Invité
    Invité(e)
    Par défaut
    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
    Code ada : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    package Gene is
       pragma Linker_Options ("-lgene");
       .../...
    end Gene;
    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
    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 :

    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
    Et tout ce passe jusqu'à la liste des référence indéfinies d'appel à Ada libgene.so et libgenetic.so.

    Appel de make :
    $ make gene && make genetic && make cgenesis
    Début du résultat :
    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 suis pas loin mais comme je ne connais que peu de chose avec C, je suis paumé.
    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.

  3. #3
    Invité
    Invité(e)
    Par défaut
    J'ai rajouté l'option -lgnat, ça va mieux, par contre je ne sais pas si c'est normal.

  4. #4
    Invité
    Invité(e)
    Par défaut Compiler le projet :
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment utiliser une bibliothèque avec Qt ?
    Par slimittn dans le forum Débuter
    Réponses: 1
    Dernier message: 14/01/2011, 21h03
  2. Réponses: 15
    Dernier message: 15/03/2010, 20h01
  3. Réponses: 3
    Dernier message: 02/09/2008, 16h17
  4. Réponses: 8
    Dernier message: 28/01/2005, 08h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo