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)