2010-04-20 70 views
10

我真的很感兴趣学习ocaml,它很快(他们说它可以编译为本地代码)并且它是功能性的。所以我尝试编写一些简单的代码,例如启用mysql事件调度程序。如何将ocaml编译为本地代码

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

它工作在ocaml的解释很好,但是当我试图把它编译为本地(我使用Ubuntu的业力),无论这些命令的工作

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

我也尝试

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

所有这些导致相同的消息

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

我再试着删除“#负载”,所以代码是这样

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

的ocamlopt结果消息

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

我希望有人能告诉我,在哪里我做错误。

+0

只是一个评论:你不需要Printf.sprintf在你展示的代码。 – 2010-04-20 22:53:16

+0

我从网上修改它(忘记地址),作为我在数据库上的第一次尝试。我已经尝试了你的消解,并且你是对的,所以我从代码中删除了“Printf.sprintf”部分。谢谢。 – 2010-04-21 03:56:10

回答

23

#load#directorytoplevel directives。他们指示ocaml在哪里可以找到mysql和unix库。对于本机(或字节码)编译,删除这些指令并将其替换为相应的command-line flags#load仅映射到文件名并且#directory-I。因此,对字节码:

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

本地代码:

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

NB:.cmxa is for native code, .cma for bytecode.同样在命令行事宜的文件名的顺序。

或者更好地利用ocamlfind和不用担心路径和扩展:

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

该命令有效,您的解释是一个真正的帮助。谢谢。 – 2010-04-21 03:58:54