Как скомпилировать 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 интерпретаторе, но когда я пытался скомпилировать его в собственный компонент (я использую кармическую человечность), ни один из них управляют работавший

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

ocamlopt, заканчивающийся сообщение

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

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

10
задан Indra Ginanjar 21 April 2010 в 02:36
поделиться

1 ответ

#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

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

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

ocamlfind ocamlopt -package unix,mysql -linkpkg mysqleventon.ml -o mysqleventon 
23
ответ дан 3 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: