2010-04-20 26 views
10

estoy realmente interesado en aprender ocaml, es rápido (dijeron que podría compilarse en código nativo) y es funcional. Así que traté de codificar algo fácil como habilitar el programador de eventos mysql.Cómo compilar ocaml al código 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);; 

que funcione bien en ocaml intérprete, pero cuando yo estaba tratando de compilar a los nativos (estoy usando Ubuntu Karmic), ninguno de estos comandos trabajaron

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

también probé

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

todos ellos resulta mismo mensaje

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

Luego trató de eliminar el "# carga", por lo que el código dice así

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

El ocamlopt resultante mensaje

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

espero que alguien podría decirme, ¿dónde estoy haciendo incorrecto.

+0

Sólo un comentario: no es necesario el Printf.sprintf en el código mostrar. –

+0

Lo modifiqué de la red (olvidé la dirección) como mi primer intento en la base de datos. Intenté tu sugestión y tienes razón, así que eliminé la parte "Printf.sprintf" del código. Gracias. –

Respuesta

23

#load y #directory son toplevel directives. Instruyen a Ocaml dónde encontrar las bibliotecas de mysql y Unix. Para la compilación nativa (o bytecode), elimine esas directivas y reemplácelas por las correspondientes command-line flags. #load mapas solo para el nombre de archivo y #directory a -I. Así que para el código de bytes:

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

código nativo:

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

NB: .cmxa is for native code, .cma for bytecode. también el orden de los nombres de ficheros en materia de línea de comandos.

O mejor uso ocamlfind y no se preocupe acerca de las rutas y extensiones:

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

El comando funciona y su explicación es de gran ayuda. Gracias. –