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 :

appel de fonction C en caml


Sujet :

Caml

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut appel de fonction C en caml
    Bonjour a tous

    Je solicite votre aide.
    J'ai développé un programme en C/caml dont je veux un executable fait avec ocamlc.

    Bref, le probleme c'est que j'ai fais l'interface en gtk (mais en C, pas avec lablgtk). Donc, mon soucis c'est a la compilation. Je fais le .o pour le fichier de l'interface mais quand je veux compiler avec ocamlc, il me sort des erreures de linkage dans tous les sens dans le fichier cmo.

    J'ai vu plus ou moins dans la doc caml comment linker des librairies mais quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ocamlc -custom -o exec inter_c.o /usr/lib/libgtk.so main.cmo
    il me sort toujours les erreures de linkage :s

    Quelqu'un pourrait me dire comment faire?

    merci

  2. #2
    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
    Tout est expliqué ici, section 18.1.3 "Statically linking C code with Caml code" et section 18.1.4 "Dynamically linking C code with Caml code" :
    http://caml.inria.fr/pub/docs/manual....html#c:intf-c

    La racine document est là :
    http://caml.inria.fr/pub/docs/manual-ocaml/index.html

    Dans ton cas, j'aurais plutôt écrit ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ocamlc -custom -dllib -lgtk -o exec inter_c.o main.cmo
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  3. #3
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    ba il semblerait que ca ne marche pas :s

    ca me ressort ca :
    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
    34
    35
    36
     
    inter_c.o: In function `lance':
    inter_c.c:(.text+0x13): référence indéfinie vers « gtk_init »
    inter_c.c:(.text+0x1d): référence indéfinie vers « gtk_window_new »
    inter_c.c:(.text+0x26): référence indéfinie vers « gtk_window_get_type »
    inter_c.c:(.text+0x32): référence indéfinie vers « g_type_check_instance_cast »
    inter_c.c:(.text+0x44): référence indéfinie vers « gtk_window_set_default_size »
    inter_c.c:(.text+0x49): référence indéfinie vers « gtk_container_get_type »
    inter_c.c:(.text+0x55): référence indéfinie vers « g_type_check_instance_cast »
    inter_c.c:(.text+0x62): référence indéfinie vers « gtk_container_set_border_width »
    inter_c.c:(.text+0x70): référence indéfinie vers « g_type_check_instance_cast »
    inter_c.c:(.text+0x89): référence indéfinie vers « gtk_main_quit »
    inter_c.c:(.text+0x93): référence indéfinie vers « g_signal_connect_data »
    inter_c.c:(.text+0xaa): référence indéfinie vers « gtk_widget_show_all »
    inter_c.c:(.text+0xaf): référence indéfinie vers « gtk_main »
    inter_c.o: In function `add_btn':
    inter_c.c:(.text+0xe1): référence indéfinie vers « gtk_button_new_with_label »
    inter_c.c:(.text+0xea): référence indéfinie vers « gtk_window_get_type »
    inter_c.c:(.text+0xf6): référence indéfinie vers « g_type_check_instance_cast »
    inter_c.c:(.text+0x103): référence indéfinie vers « gtk_window_set_title »
    inter_c.c:(.text+0x10f): référence indéfinie vers « gtk_button_new_with_mnemonic »
    inter_c.c:(.text+0x118): référence indéfinie vers « gtk_window_get_type »
    inter_c.c:(.text+0x124): référence indéfinie vers « g_type_check_instance_cast »
    inter_c.c:(.text+0x131): référence indéfinie vers « gtk_window_set_title »
    inter_c.c:(.text+0x13d): référence indéfinie vers « gtk_button_new_from_stock »
    inter_c.c:(.text+0x146): référence indéfinie vers « gtk_window_get_type »
    inter_c.c:(.text+0x152): référence indéfinie vers « g_type_check_instance_cast »
    inter_c.c:(.text+0x15f): référence indéfinie vers « gtk_window_set_title »
    inter_c.c:(.text+0x16d): référence indéfinie vers « g_type_check_instance_cast »
    inter_c.c:(.text+0x186): référence indéfinie vers « gtk_main_quit »
    inter_c.c:(.text+0x190): référence indéfinie vers « g_signal_connect_data »
    inter_c.c:(.text+0x195): référence indéfinie vers « gtk_container_get_type »
    inter_c.c:(.text+0x1a1): référence indéfinie vers « g_type_check_instance_cast »
    inter_c.c:(.text+0x1ad): référence indéfinie vers « gtk_container_add »
    collect2: ld returned 1 exit status
    Error while building custom runtime system

  4. #4
    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
    Comment a-tu compilé inter_c.o ? Peux-tu donner toutes les commandes que tu as utilisées pour compiler ?
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    bonjour,
    SVP, je travail pratiquement sur la meme chose que vous, c'est a dire ke je doit developper une interface en C ( via GTK) et ecrire un programme OCAML qui utilise cette interface.(le passage entre OCAML et le C se fait dans les deux sens c'est dire le programme C peut appler les programme OCAML et inversement) j'ai lu le tutoriel qui est a ce lien:
    http://www.univ-valenciennes.fr/ROI/...15.html#toc147
    c'est tres bien expliqué, mais j'ai pas compris comment faire pour la compilation et l'exécution des programmes!!? j'ai pas su ou je doit enregistrer mes programmes, est ce que je doit les enregistrer dans un meme fichier ou pas!!le quel des deux programmes je doit compiler en premier??...etc.
    merci d'avance
    PS:
    j'utilise la version 3.09.3 de OCAML, et j'utilise code::block comme compilateur pour le langage C.

  6. #6
    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
    Citation Envoyé par slider22
    PS:
    ... et j'utilise code::block comme compilateur pour le langage C.
    Compile à la main, ce sera beaucoup plus simple.

    Tu as toute la documentation ici :

    http://caml.inria.fr/pub/docs/manual...manual032.html

    La racine du document est là :

    http://caml.inria.fr/pub/docs/manual-ocaml/index.html
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Pourquoi ne pas développer l'interface directement en OCaml ? OCaml a un binding GTK.

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    bluestorm a ecrit:
    Pourquoi ne par développer l'interface directement en OCaml ? OCaml a un binding GTK.
    en faite j'avais deja esséyé mais j'ai trouvé un probleme quand a l'instalation du GTK ( et LABLGTK aussi). c'est pour cette raison que j'ai changé ,et je voulais profiter de l'interopérabilité entre OCAML et le langage C.

    InOCamlWeTrust a dit:
    Compile à la main, ce sera beaucoup plus simple.
    SVP qu'est ce que vous voulez dire par "compile a la main"!!
    SVP est ce que vous pouvez me dire si je doit enregistrer les programmes OCAML et C dans UN MEME FICHIER ou bien cela ne causra pas de probléme? ( sur les lien que vous m'qvez donnez ils ne parle pas de ca!!)
    merci

  9. #9
    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
    Qu'est-ce que tu veux dire par un même fichier ? Les sources restent des sources ! Ce que tu as écrit dans des fichiers différents doit rester dans des fichiers différents : je ne vois vraiment pas pourquoi on voudrait tout regrouper !

    Compiler à la main signifie écrire directement les commandes nécessaires à la compilation... bref, pas faire un truc à la souris du genre : Edition -> Commandes -> Compiler...
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    donc si j'ai bien compri, je doit faire une compilation sous DOS!!
    est ce qu'il est important de compiler le programme OCAML en premier, ou bien le programme C? ( ou l'ordre importe peu!!).
    je suis daccord avec vous sur le faite que c'est pas la peine d'enregistrer les programmes dans un meme fichier!!
    mais SVP dans le cas ou je fait une comilation sous DOS est que je dois me positionner dans un emplacement précis ou pas!! c'est a dire est ce que par exemple je doit aller dans: c:/programe files/ocaml/lib, ou bien cela n'est pas important!!
    merci

  11. #11
    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
    Pour ce qui est de l'ordre de compilation des fichiers, prends exemple sur la documentation dont j'ai donné le lien plus haut. L'ordre de compilation est celui imposé par le programme, son architecture, mais étant donné que les parties C et OCaml sont indépendantes lors de la compilation (le compilateur C ne connaît pas les fichiers interface OCaml et Caml ne regarde pas les fichiers d'en-tête), tu peux les compiler dans l'ordre que tu veux.

    Si ton interface est faite avec GTK, je te conseille également d'utiliser lablgtk, ainsi, tu auras tout ton programme fait avec OCaml.

    Enfin, tu n'as pas besoin a priori de te placer dans un dossier particulier.
    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. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 14h54
  2. Réponses: 4
    Dernier message: 19/04/2004, 13h41
  3. [JSP] Appeler une fonction
    Par Patrick95 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 23/12/2003, 13h44
  4. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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