如何将ocaml编译为本机代码

Ind*_*jar 10 ocaml native compilation

我真的很感兴趣学习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);;
Run Code Online (Sandbox Code Playgroud)

它在ocaml解释器上工作正常,但当我尝试将其编译为native(我使用的是ubuntu karmic)时,这些命令都没有工作

ocamlopt -o mysqleventon mysqleventon.ml unix.cmxa mysql.cmxa
ocamlopt -o mysqleventon mysqleventon.ml unix.cma mysql.cma
Run Code Online (Sandbox Code Playgroud)

我也试过了

ocamlc -c mysqleventon.ml unix.cma mysql.cma
Run Code Online (Sandbox Code Playgroud)

所有这些都产生了同样的信息

File "mysqleventon.ml", line 1, characters 0-1:
Error: Syntax error
Run Code Online (Sandbox Code Playgroud)

然后我试图删除"#load",所以代码就是这样

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

ocamlopt结果消息

File "mysqleventon.ml", line 1, characters 9-28:
Error: Unbound value Mysql.quick_connect
Run Code Online (Sandbox Code Playgroud)

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

ygr*_*rek 23

#load并且#directory顶级指令.他们指示ocaml在哪里可以找到mysql和unix库.对于本机(或字节码)编译,删除这些指令并用相应的命令行标志替换它们.#load地图只是文件名和#directory-I.所以对于字节码:

ocamlc unix.cma -I +mysql mysql.cma mysqleventon.ml -o mysqleventon
Run Code Online (Sandbox Code Playgroud)

原生代码:

ocamlopt unix.cmxa -I +mysql mysql.cmxa -o mysqleventon mysqleventon.ml
Run Code Online (Sandbox Code Playgroud)

注意:.cmxa用于本机代码,.cma用于字节码.命令行上的文件名顺序也很重要.

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

ocamlfind ocamlopt -package unix,mysql -linkpkg mysqleventon.ml -o mysqleventon 
Run Code Online (Sandbox Code Playgroud)