Как скомпилировать ocaml в нативный код - PullRequest
10 голосов
/ 20 апреля 2010

Мне действительно интересно изучать 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 Ответ

23 голосов
/ 20 апреля 2010

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

Примечание: .cmxa для собственного кода, .cma для байт-кода. Также имеет значение порядок имен файлов в командной строке.

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

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