2010-04-20 6 views
10

Je suis vraiment intéressé à apprendre ocaml, rapidement (ils ont dit qu'il pourrait être compilé en code natif) et c'est fonctionnel. J'ai donc essayé de coder quelque chose de facile comme activer le planificateur d'événements mysql.Comment compiler ocaml en code natif

#load "unix.cma";; 
#directory "+mysql";; 
#load "mysql.cma";; 
let db = Mysql.quick_connect 
    ~user:"username" 
    ~password:"userpassword" 
    ~database:"databasename"();; 
let sql = 
    "SET GLOBAL EVENT_SCHEDULER=1;" 
    in 
    (Mysql.exec db sql);; 

Il fonctionne très bien sur interprète OCaml, mais quand je tentais de le compiler à natif (j'utilise ubuntu karmique), aucune de ces commandes a travaillé

ocamlopt -o mysqleventon mysqleventon.ml unix.cmxa mysql.cmxa 
ocamlopt -o mysqleventon mysqleventon.ml unix.cma mysql.cma 

J'ai aussi essayé

ocamlc -c mysqleventon.ml unix.cma mysql.cma 

tous résultant même message

File "mysqleventon.ml", line 1, characters 0-1: 
Error: Syntax error 

Alors j'ai essayé de supprimer le « # charge », de sorte que le code va comme ceci

let db = Mysql.quick_connect 
    ~user:"username" 
    ~password:"userpassword" 
    ~database:"databasename"();; 
let sql = 
    "SET GLOBAL EVENT_SCHEDULER=1;" 
    in 
    (Mysql.exec db sql);; 

Le message résultant ocamlopt

File "mysqleventon.ml", line 1, characters 9-28: 
Error: Unbound value Mysql.quick_connect 

J'espère que quelqu'un pourrait me dire, où est-ce que je fais faux.

+0

Juste un commentaire: vous n'avez pas besoin Printf.sprintf dans le code que vous montrez. –

+0

Je l'ai modifié de net (j'ai oublié l'adresse) comme ma première tentative sur la base de données. J'ai essayé votre suggestion, et vous avez raison, alors j'enlève la partie "Printf.sprintf" du code. Je vous remercie. –

Répondre

23

#load et #directory sont les toplevel directives. Ils indiquent à ocaml où trouver les bibliothèques mysql et unix. Pour la compilation native (ou bytecode), supprimez ces directives et remplacez-les par command-line flags. #load correspond uniquement au nom de fichier et #directory à -I. Donc, pour bytecode:

ocamlc unix.cma -I +mysql mysql.cma mysqleventon.ml -o mysqleventon 

code natif:

ocamlopt unix.cmxa -I +mysql mysql.cmxa -o mysqleventon mysqleventon.ml 

NB: .cmxa is for native code, .cma for bytecode. également l'ordre des noms sur les questions de ligne de commande.

Ou mieux utiliser ocamlfind et ne vous inquiétez pas sur les chemins et les extensions:

ocamlfind ocamlopt -package unix,mysql -linkpkg mysqleventon.ml -o mysqleventon 
+0

La commande fonctionne et votre explication est une aide réelle. Je vous remercie. –