2010-04-20 5 views
10

Ich bin wirklich daran interessiert zu lernen, ocaml, es schnell (sie sagten, es könnte zu nativem Code kompiliert werden) und es ist funktional. Also habe ich versucht, etwas so einfach zu programmieren wie mysql event scheduler.So kompilieren Sie Ocaml zu nativem Code

#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);; 

Es funktionieren auf ocaml Dolmetscher, aber wenn ich es auf native zu kompilieren versuchte (ich bin ubuntu karmischen verwenden), arbeitete keiner dieser Befehl

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

Ich habe auch versucht

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

alle von ihnen resultierenden gleiche Nachricht

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

Ich habe versucht, die „# load“ zu entfernen, so geht der Code wie dieser

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

Die ocamlopt resultierende Nachricht

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

Ich hoffe, dass mir jemand sagen könnte, wo habe ich tue falsch.

+0

einfach einen Kommentar: Sie brauchen nicht auf die Printf.sprintf im Code Ihnen zeigen. –

+0

Ich habe es von net (vergessen Sie die Adresse) als mein erster Versuch auf Datenbank geändert. Ich habe versucht, Ihre Vermutung, und Sie haben Recht, so dass ich "Printf.sprintf" Teil aus dem Code entfernen. Vielen Dank. –

Antwort

23

#load und #directory sind die toplevel directives. Sie weisen ocaml an, wo sie mysql- und unix-Bibliotheken finden können. Entfernen Sie für native (oder Bytecode) Kompilierung diese Direktiven und ersetzen Sie sie durch entsprechende command-line flags. #load maps nur auf den Dateinamen und #directory zu -I. Also für Bytecode:

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

nativem Code:

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

NB: .cmxa is for native code, .cma for bytecode. Auch die Reihenfolge der Dateinamen auf Befehlszeilen Angelegenheiten.

Oder eine bessere Nutzung ocamlfind und sich keine Sorgen über Pfade und Erweiterungen:

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

Der Befehl funktioniert und Ihre Erklärung ist eine echte Hilfe. Vielen Dank. –