2010-04-20 18 views
10

Sono davvero interessato all'apprendimento ocaml, è veloce (hanno detto che potrebbe essere compilato in codice nativo) ed è funzionale. Così ho provato a programmare qualcosa di semplice come abilitare lo scheduler di eventi mysql.Come compilare ocaml al codice nativo

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

Funziona bene su interprete OCaml, ma quando stavo cercando di compilarlo a nativa (sto usando ubuntu karmico), nessuno di questi comandi lavorato

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

Ho anche provato

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

tutti loro risultante stesso messaggio

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

poi ho cercato di rimuovere il "# carico", in modo che il codice va come questo

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

L'ocamlopt risultante messaggio

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

spero che qualcuno potrebbe dirmi, dove ho sto facendo sbagliato.

+0

Solo un commento: non è necessario il Printf.sprintf nel codice si mostra. –

+0

L'ho modificato dalla rete (ho dimenticato l'indirizzo) come primo tentativo di database. Ho provato la tua congestione e hai ragione, quindi rimuovo la parte "Printf.sprintf" dal codice. Grazie. –

risposta

23

#load e #directory sono toplevel directives. Istruiscono ocaml dove trovare le librerie mysql e unix. Per la compilazione nativa (o bytecode), rimuovere tali direttive e sostituirle con lo command-line flags corrispondente. #load mappa solo per il nome del file e #directory a -I. Così, per bytecode:

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

codice nativo:

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

NB: .cmxa is for native code, .cma for bytecode. Anche l'ordine dei nomi di file in materia della riga di comando.

O meglio l'uso ocamlfind e non preoccuparti di percorsi e le estensioni:

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

Il comando funziona e la tua spiegazione è un vero aiuto. Grazie. –

Problemi correlati