如何将ocaml编译为本机代码

时间:2010-04-20 04:39:13

标签: compilation ocaml native

我真的很感兴趣学习ocaml,它很快(他们说它可以编译为本机代码)并且它的功能。所以我试着像启用mysql事件调度程序那样编写简单的代码。

#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解释器上运行正常,但当我尝试将其编译为native(我使用的是ubuntu karmic)时,这些命令都不起作用

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

然后我尝试删除“#load”,所以代码就像这样

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

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

1 个答案:

答案 0 :(得分: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

注意:.cmxa is for native code, .cma for bytecode.此外,命令行上文件名的顺序也很重要。

或者更好地使用ocamlfind,不要担心路径和扩展名:

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