Как скомпилировать ocaml для собственного кода

Мне очень интересно учиться 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

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

Ответ 1

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

Или лучше использовать ocamlfind и не беспокоиться о путях и расширениях:

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