2010-04-20 39 views
10

Tôi thực sự quan tâm đến việc học ocaml, nó nhanh (họ nói nó có thể được biên dịch thành mã gốc) và nó hoạt động. Vì vậy, tôi đã cố gắng để mã một cái gì đó dễ dàng như cho phép lập lịch sự kiện mysql.Cách biên dịch ocaml thành mã gốc

#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);; 

Nó hoạt động tốt trên phiên dịch ocaml, nhưng khi tôi đã cố gắng để biên dịch nó để mẹ đẻ (Tôi đang sử dụng Ubuntu Karmic), không phải của các lệnh làm việc

ocamlopt -o mysqleventon mysqleventon.ml unix.cmxa mysql.cmxa 
ocamlopt -o mysqleventon mysqleventon.ml unix.cma mysql.cma 

tôi cũng đã cố gắng

ocamlc -c mysqleventon.ml unix.cma mysql.cma 

tất cả trong số họ kết quả tương tự nhắn

File "mysqleventon.ml", line 1, characters 0-1: 
Error: Syntax error 

Sau đó, tôi đã cố gắng để loại bỏ các "# tải", do đó mã đi như thế này

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

Các ocamlopt kết quả nhắn

File "mysqleventon.ml", line 1, characters 9-28: 
Error: Unbound value Mysql.quick_connect 

Tôi hy vọng ai đó có thể cho tôi biết, đâu tôi đang làm sai rồi.

+0

Chỉ cần một lời nhận xét: bạn không cần Printf.sprintf trong mã mà bạn thấy. –

+0

Tôi đã sửa đổi nó từ mạng (quên địa chỉ) như là nỗ lực đầu tiên của tôi trên cơ sở dữ liệu. Tôi đã thử sugestion của bạn, và bạn là đúng, vì vậy tôi loại bỏ "Printf.sprintf" một phần từ mã. Cảm ơn bạn. –

Trả lời

23

#load#directorytoplevel directives. Họ hướng dẫn ocaml nơi để tìm mysql và unix thư viện. Đối với trình biên dịch gốc (hoặc bytecode), hãy loại bỏ các chỉ thị đó và thay thế chúng bằng command-line flags tương ứng. #load bản đồ chỉ với tên tệp và #directory đến -I. Vì vậy, đối bytecode:

ocamlc unix.cma -I +mysql mysql.cma mysqleventon.ml -o mysqleventon 

đang Quê quán:

ocamlopt unix.cmxa -I +mysql mysql.cmxa -o mysqleventon mysqleventon.ml 

NB: .cmxa is for native code, .cma for bytecode. Cũng theo thứ tự của tên tập tin về những vấn đề dòng lệnh.

Hoặc tốt hơn sử dụng ocamlfind và đừng lo lắng về những con đường và phần mở rộng:

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

Lệnh hoạt động và lời giải thích của bạn là một trợ giúp thực sự. Cảm ơn bạn. –

Các vấn đề liên quan