2010-04-20 3 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);; 

The ocamlopt в результате сообщения

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

Я надеюсь, что кто-то может сказать мне, где же я делаю неправильно.

+0

Просто комментарий: Вы не нуждаетесь в Printf.sprintf в коде вы показываете. –

+0

Я изменил его из сети (забыл адрес) в качестве первой попытки базы данных. Я пробовал ваш sugestion, и вы правы, поэтому я удаляю часть «Printf.sprintf» из кода. Спасибо. –

ответ

23

#load и #directory - toplevel directives. Они инструктируют ocaml, где найти библиотеки mysql и unix. Для компиляции native (или байткода) удалите эти директивы и замените их соответствующими 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

Команда работает, и ваше объяснение - реальная помощь. Спасибо. –