2010-04-20 69 views
10

我真的很感興趣學習ocaml,它很快(他們說它可以編譯爲本地代碼)並且它是功能性的。所以我嘗試編寫一些簡單的代碼,例如啓用mysql事件調度程序。如何將ocaml編譯爲本地代碼

#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的業力),無論這些命令的工作

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 

我再試着刪除「#負載」,所以代碼是這樣

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

只是一個評論:你不需要Printf.sprintf在你展示的代碼。 – 2010-04-20 22:53:16

+0

我從網上修改它(忘記地址),作爲我在數據庫上的第一次嘗試。我已經嘗試了你的消解,並且你是對的,所以我從代碼中刪除了「Printf.sprintf」部分。謝謝。 – 2010-04-21 03:56:10

回答

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 

NB:.cmxa is for native code, .cma for bytecode.同樣在命令行事宜的文件名的順序。

或者更好地利用ocamlfind和不用擔心路徑和擴展:

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

該命令有效,您的解釋是一個真正的幫助。謝謝。 – 2010-04-21 03:58:54