我真的很感兴趣学习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
我希望有人能告诉我,我在哪里做错了。
答案 0 :(得分:23)
#load
和#directory
是toplevel 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