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

Caml Discussion :

Interface Ocaml/C sous windows


Sujet :

Caml

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Interface Ocaml/C sous windows
    Bonjour.
    J'ai regardé tous les tutos que j'ai pu trouver pourinterfacer du code C dans Ocaml (le DAOC, la page de F. Monnier
    et ici même le tuto de anne pacalet) et je n'y arrive pas.
    J'ai une erreur de gcc qui apparait à propos du fichier config.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    In file included from C:/OCaml/lib/caml/mlvalues.h:22,
                     from wrap.c:2:
    C:/OCaml/lib/caml/config.h:140: erreur: erreur d'analyse syntaxique avant << int64 >>
    C:/OCaml/lib/caml/config.h:140: attention : la d'efinition de donn'ees n'a pas de type ni de classe de stockage
    C:/OCaml/lib/caml/config.h:141: erreur: erreur d'analyse syntaxique avant << uint64 >>
    C:/OCaml/lib/caml/config.h:141: attention : la d'efinition de donn'ees n'a pas de type ni de classe de stockage
    J'ai installé la version mingw de ocaml, et je l'utilise sous mingw de cygwin (comme indiqué dans le manuel d'install de Ocaml, quand on veut developper une application en natif)
    Pour mon test, j'essaye de compiler une fonction très simple :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    #include <caml/mlvalues.h>
     
    CAMLprim value
    _get_an_int( value v )
    {
        int i;
        i = Int_val(v);
        printf("%d\n", i);
        return Val_unit;
    }

    De plus, je ne comprends pas pourquoi le compilo c me fait **** avec les int64 ayant une machine 32bits (mais bon là, j'ai peut etre mal compris la réponse de l'erreur)
    Peut-être quelqu'un pourra me sortir de cette impasse.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 32
    Points
    32
    Par défaut macro mal définie
    le problème ne viens pas de ton code, tu auras probablement la même erreur en essayant de compiler un autre wrapper existant.

    par contre je ne dois pas avoir la même version d'ocaml que toi, je n'ai rien aux lignes 140 et 141 du fichier <caml/config.h> il faudrait que tu nous copie-colle ce que tu as à ces lignes pour que l'on sache pourquoi cela bloque à cet endroit.

    si tu souhaites chercher par toi même une piste pourrait être de regarder le résultat de la commande cpp sur ce fichier, tu pourrais alors peut-être comprendre ce qui bloque, peut-être est-ce qu'il te manque un fichier d'entête du C ?

    chez moi <caml/config.h> définit ces deux types par :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef ARCH_INT64_TYPE int64;
    typedef ARCH_UINT64_TYPE uint64;
    et après passage au travers du préprocesseur cpp cela devient :
    typedef long long int64;
    typedef unsigned long long uint64;

    je viens d'essayer de compiler un programme test où FAKE_MACRO n'est pas définit :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef FAKE_MACRO t;
    int main(void) {
            return 0;
    }
    et j'obtiens le même message d'erreur que toi (bon mais en anglais)
    ton problème semble donc clair, c'est la macro ARCH_INT64_TYPE qui n'est pas définie chez toi, pour une raison qu'il va falloir trouver.
    chez moi cette macro est correctement définie dans un des fichiers d'entête OCaml.
    Si elle n'est pas présente chez toi, c'est peut-être l'installation d'OCaml qui a eut un problème, je viens de regarder dans les sources d'ocaml pour voir comment c'était configuré, j'ai fait dans les sources :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    % rgrep ARCH_INT64_TYPE *
    byterun/config.h:typedef ARCH_INT64_TYPE intnat;
    config/m-nt.h:#define ARCH_INT64_TYPE long long
    configure:     echo "#define ARCH_INT64_TYPE long long" >> m.h
    ....
    peut-être pourrais-tu essayer de regarder par là ce qui a put ne pas marcher,
    ou si tu as installé OCaml à partir d'un paquetage précompilé, il semblerait qu'il soit défaillant
    Si tu ne parviens pas à résoudre ton problème tu pourrais toujours essayer de réinstaller ocaml avec une autre méthode...

    désolé de pas pouvoir t'aider plus

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 32
    Points
    32
    Par défaut reposer
    si tu n'arrives pas à résoudre ton problème avec mes quelques indications hasardeuses :-) reposes ta question sur la liste principale d'ocaml mais en reposant ta question sur le vrai problème soujacent c'est à dire en expliquant que la macro qui définit int64 n'est pas définie correctement...

  4. #4
    alex_pi
    Invité(e)
    Par défaut
    Peux tu préciser exactement la version de OCaml qui pose problème ?

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour.
    J'utilise la version 3.10 de Ocaml, version mingw native.
    En fait, le problème il me semble est quand j'impose g++ pour compiler mon fichier c (je dois utiliser g++ car je dois utiliser un fichier écrit en c++).

    Voici ce que contient mon fichier config.h aux lignes 139-148 :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #if defined(ARCH_INT64_TYPE)
    typedef ARCH_INT64_TYPE int64;
    typedef ARCH_UINT64_TYPE uint64;
    #else
    #  ifdef ARCH_BIG_ENDIAN
    typedef struct { uint32 h, l; } uint64, int64;
    #  else
    typedef struct { uint32 l, h; } uint64, int64;
    #  endif
    #endif

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    EUh, en fait je me suis trompé.
    Pour gcc c'est cela : (commande ocamlopt -cc "gcc" wrap.c et funs.ml)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    In file included from C:/OCaml/lib/caml/memory.h:24,
                     from wrap.c:3:
    C:/OCaml/lib/caml/config.h:140: erreur: erreur d'analyse syntaxique avant << int64 >>
    C:/OCaml/lib/caml/config.h:140: attention : la d'efinition de donn'ees n'a pas de type ni de classe de stockage
    C:/OCaml/lib/caml/config.h:141: erreur: erreur d'analyse syntaxique avant << uint64 >>
    C:/OCaml/lib/caml/config.h:141: attention : la d'efinition de donn'ees n'a pas de type ni de classe de stockage
    et pour g++ c'est : (commande ocamlopt -cc "g++" wrap.c et funs.ml)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    In file included from C:/OCaml/lib/caml/memory.h:24,
                     from wrap.c:3:
    C:/OCaml/lib/caml/config.h:140: erreur: << __int64 >> ne nomme pas un type
    C:/OCaml/lib/caml/config.h:141: erreur: << __int64 >> ne nomme pas un type
    et pour les fichiers suivant (différents de mon premier post, car j'ai fais plein de tests différents):
    wrap.c
    Code c : 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
    #include <stdio.h>
     
    #include <caml/memory.h>
    #include <caml/mlvalues.h>
     
    value plus_native (value x1,value x2,value x3,value x4,value x5,value x6)
    {
      printf("<< PLUS NATIF >>\n") ; fflush(stdout) ;
      return Val_long ( Long_val(x1) + Long_val(x2) + Long_val(x3)
                      + Long_val(x4) + Long_val(x5) + Long_val(x6)) ;
    }
     
    value plus_bytecode (value * tab_val, int nb_val)
    {
      int i;
      long res;
      printf("<< PLUS BYTECODE >> : ") ; fflush(stdout) ;
      for (i=0,res=0;i<nb_val;i++) res += Long_val(tab_val[i]) ;
      return Val_long(res) ;
    }

    et funs.ml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    external plus : int -> int -> int -> int -> int -> int -> int 
                  = "plus_bytecode" "plus_native" ;;
    print_int (plus 1 2 3 4 5 6) ;;
    print_newline () ;;
    Ces exemples sont tirés du DAOC.

    Ah oui, quand je ne précise pas le compilateur, la compilation se passe bien.
    Donc peut être que je dois inclure un fichier suplémentaire, que ocamlopt fait tout seul si le le compilo c n'est pas précisé...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    Tu ne sembles pas avoir compris ce que je t'ai dis précédemment.
    ça ne sert à rien de t'acharner à essayer de compiler des trucs alors que ton installation d'OCaml est défectueuse, tu auras toujours le même problème, qui d'ailleur si je reprends l'exemple que je t'avais donné en C et que j'essaie de le compiler avec g++ j'obtiens toujours la même erreur :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef FAKE_MACRO t;
    int main(void) {
            return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    g++ -o test test.cxx
    test.cxx:1: error: 'FAKE_MACRO' does not name a type
    essayer de définir un type avec une macro non définie, ne pourra pas marcher quoique tu fasses.....
    et ton ordinateur sera toujours plus têtu que toi !

  8. #8
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    et ton ordinateur sera toujours plus têtu que toi !
    Mais non, mais non... il suffit de s'en donner les moyens : .
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/10/2009, 09h28
  2. ocaml sous windows avec crimson editor
    Par ghostt2017 dans le forum Caml
    Réponses: 3
    Dernier message: 15/06/2007, 15h15
  3. Interface graphique PERL sous Windows?
    Par piotr dans le forum Web
    Réponses: 5
    Dernier message: 23/07/2006, 16h07
  4. oracle-interface PHP sous windows
    Par nonaM1982 dans le forum Oracle
    Réponses: 1
    Dernier message: 17/02/2006, 17h13
  5. Interface graphique pour NMAP sous windows ?
    Par elitost dans le forum Développement
    Réponses: 2
    Dernier message: 07/11/2005, 00h09

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