Как скомпилировать 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