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 :

Scanf et Dynlink


Sujet :

Caml

  1. #1
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut Scanf et Dynlink
    Bonjour à tous !

    Je viens d'observer un comportement étrange avec Scanf et Dynlink, qui m'ennuie beaucoup. J'ignore cependant s'il s'agit d'une erreur de ma part ou d'un bug. J'ai d'ores et déjà soumis un rapport de bug sur le bug tracker d'OCaml ; mais en raison des délais, je me permets aussi de soulever la question ici.

    L'idée est très simple. Voici un fichier main.ml qui contient un prog tout simple (et parfaitement sans intérêt) destiné à charger dynamiquement des plugins ou fichiers partagés (fichiers .cmxs) :

    Code ocaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (* ocamlopt dynlink.cmxa -o main main.ml *)
    open Dynlink
    
    let load x = try loadfile x with Error e -> prerr_endline (error_message e) 
    
    let _ = Arg.parse [] load "Usage: main <plugin>"

    Voici maintenant le plugin que l'on souhaite charger (plugin.ml) :
    Code ocaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (* ocamlopt -share -o plugin.cmxs plugin.ml *)
    let _ =
      let str = read_line () in 
      Scanf.sscanf str "%d" (fun _ -> print_endline "Done")

    Après compilation avec OCaml 3.11.0, lorsque je lance ./main plugin.cmxs dans un terminal, j'obtiens toujours la même erreur :
    error loading shared library: plugin.cmxs: undefined symbol: camlScanf__from_string_148

    Avec un nom pareil, j'ai décidé d'enlever tout appel à Scanf dans le code du plugin... et le problème disparaît.

    Observez-vous aussi ce comportement ? Merci d'avance.

    Cordialement,
    Cacophrène

    PS : Ce n'est pas la première fois que Scanf me donne des résultats pour le moins étranges. La toute première fois, c'était avec la fonction Scanf.format_from_string. Et je doute que le problème soit corrigé... mais c'est une autre histoire qui ne nous intéresse pas ici.

  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
    Je ne connais pas OCaml 3.11 (désolé, ça commence à faire pas mal de temps que je ne code plus).

    Pourrais-tu donner les commandes de compilation ou le Makefile ?

    Et si dans le plugin tu fais référence à un autre module, par exemple que tu as fait toi-même ? Ca marche ou pas ?

    Fais-tu un strip quelconque, ou OCaml le fait-il pour toi (ça m'étonnerait, car la machine virtuelle ne fonctionne pas une fois le strip effectué) ?
    When Colt produced the first practical repeating handgun, it gave rise to the saying God created men, but Colt made them equal.

  3. #3
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Salut !

    Citation Envoyé par InOCamlWeTrust
    Pourrais-tu donner les commandes de compilation ou le Makefile ?
    Les commandes de compilation sont celles indiquées (mais peu visibles, je m'en rends compte maintenant) en commentaire dans les bouts de code, à savoir :

    Pour le plugin : ocamlopt -share -o plugin.cmxs plugin.ml
    Pour le programme : ocamlopt dynlink.cmxa -o main main.ml

    Citation Envoyé par InOCamlWeTrust
    Et si dans le plugin tu fais référence à un autre module, par exemple que tu as fait toi-même ? Ca marche ou pas ?
    Ça marche bien, même avec des modules persos, dès lors qu'il n'y a pas d'appel aux fonctions du module Scanf.

    Fais-tu un strip quelconque, ou OCaml le fait-il pour toi ?
    Rien de tel qui pourrait expliquer ce comportement étrange.

    Je pense d'autant plus à un bug que camlScanf__from_string_148 est typiquement le style de nom qu'utilise OCaml en interne...

    Cordialement,
    Cacophrène

  4. #4
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Dernière minute : il faut utiliser -linkall pour compiler le programme principal, sans quoi Scanf (ou tout autre module qui n'est pas utilisé dans le prog principal) n'est pas accessible lors de la création de plugins. Je viens d'avoir une réponse sur le site du bug tracker. Je marque donc ce problème comme résolu... et mouarf, désolé pour le bruit inutile sur ce forum. Encore fallait-il le savoir. C'est vrai que Dynlink en natif c'est plutôt récent.

    Cordialement,
    Cacophrène

  5. #5
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Pas de problème, au contraire on est content d'apprendre quelque chose.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

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

Discussions similaires

  1. scanf
    Par bourinator dans le forum C
    Réponses: 8
    Dernier message: 26/09/2003, 14h04
  2. bp scanf...
    Par drKzs dans le forum C
    Réponses: 6
    Dernier message: 18/09/2003, 23h08
  3. PB avec scanf
    Par ché dans le forum C
    Réponses: 6
    Dernier message: 13/08/2003, 07h25
  4. [debutant]la fonction scanf
    Par kalaka dans le forum C
    Réponses: 7
    Dernier message: 01/07/2003, 15h15
  5. Réponses: 6
    Dernier message: 10/09/2002, 03h35

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