Я пытаюсь изучить OCaml, я создал очень простой пример, чтобы открыть, а затем закрыть файл sqlite.
let () =
let db = Sqlite3.db_open "test.db" in
Sqlite3.db_close db
Я сделал opam install sqlite3 и вижу файлы .opam/default/lib/sqlite3 на месте. Я ожидаю, что это означает, что пакет установлен.
Когда я бегу ocaml sqltest.ml, я ожидаю, что это будет выполнено. Вместо этого я получаю Error: Unbound module Sqlite3
Даже когда я делаю это ocaml -I +sqlite3 sqltest.ml, я получаю тот же результат. Довольно сложно искать информацию об ocaml, и большинство вещей, которые я нахожу, используют dune, ocamlbuild, ocamlfind или что-то в этом роде... Я думаю, это нормально, но в интересах начать с основ и строить оттуда, я бы хотел понять, как работают все части. Я полагаю, что базовые ocaml или ocamlc должны работать в этом простом случае.
Как мне понять, где находятся эти библиотеки, и использовать их? Почему он не понимает свои собственные «библиотеки по умолчанию»?





Использование ocamlfind для компиляции простой демонстрационной программы, открывающей модуль Sqlite3.
$ cat test.ml
open Sqlite3
let () = print_endline "hello"
$ ocamlc test.ml
File "test.ml", line 1, characters 5-12:
1 | open Sqlite3
^^^^^^^
Error: Unbound module Sqlite3
$ ocamlfind ocamlc test.ml -package sqlite3 -linkpkg
$ ./a.out
hello
Альтернативное использование окамлфинда:
$ ocamlc -I `ocamlfind query sqlite3` sqlite3.cma test.ml
$ ./a.out
hello
В качестве примечания, ваш код не будет компилироваться даже при правильном использовании компилятора и ocamlfind, потому что Sqlite3.db_close возвращает логическое значение, вы пытаетесь связать это выражение с (). Это несоответствие типов.
И вы открыли Sqlite3, поэтому вам не нужно использовать полные имена. Возможно, вы захотите использовать let&, чтобы избежать db_close.
open Sqlite3
let () =
let& db = db_open "test.db" in
print_endline "hello"
Они не. sqlite3.cma находится в каталоге sqlite3, который сам находится в ~/.opam/5.0.0/lib.
Обратитесь к переменной среды CAML_LD_LIBRARY_PATH для каталогов, в которых выполняется автоматический поиск динамически загружаемых библиотек.
Я вижу, что
ocamlfindработает... но зачем это нужно, если пакеты уже находятся в каталоге lib по умолчанию?