Compilation 如何将ocaml编译为本机代码

Compilation 如何将ocaml编译为本机代码,compilation,ocaml,native,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 =

我对学习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解释器上运行良好,但当我试图将其编译为本机时(我使用的是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
我希望有人能告诉我,我哪里做错了。

加载和
#目录
。他们指导ocaml在哪里找到mysql和unix库。对于本机(或字节码)编译,删除这些指令并用相应的指令替换它们
#load
仅映射到文件名,而
#目录
映射到
-I
。所以对于字节码:

ocamlc unix.cma -I +mysql mysql.cma mysqleventon.ml -o mysqleventon
本机代码:

ocamlopt unix.cmxa -I +mysql mysql.cmxa -o mysqleventon mysqleventon.ml
注意:还有命令行事务中文件名的顺序

或者最好使用ocamlfind,不必担心路径和扩展:

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

只是一个注释:您不需要在显示的代码中使用Printf.sprintf。我第一次尝试使用数据库时从net修改了它(忘记了地址)。我试过你的建议,你是对的,所以我从代码中删除了“Printf.sprintf”部分。谢谢。这个命令很有效,你的解释真的很有帮助。非常感谢。