Ошибка подключения модуля в ocaml

Я начинаю начинать с программирования Ocaml, и мне сложно связать модуль с моей программой. Фактически я выполняю проверку регулярных выражений, и я написал функцию, которая в основном токенизирует строку на основе разделительной строки, используя Str-модуль. Поэтому я использую функции, определенные в библиотеке следующим образом:

Str.regexp_string /*and so on*/

Однако, когда я пытаюсь скомпилировать файл ml, я получаю сообщение об ошибке, указывающее, что у меня есть undefined global Str. Мы используем функции List, введя ListLength и т.д. Так же, как я сделал для Str, не указывая явно конкретный модуль. Я попробовал

open Str;;
include Str;; /*None of these work and I still get the same error*/

Однако если в верхнем я использую

load "str.cma" /*Then the program works without problems*/

Я хочу включить модуль в файл ml, потому что мне нужно в конце ссылку 3 cmo, чтобы получить окончательный исполняемый файл (который не запускается в верхнем уровне). Я знаю, что это действительно основной вопрос, но у меня проблемы с его решением. Спасибо заранее.

Ответ 1

Вам не нужно ничего добавлять в файл foo.ml. Вам нужно сообщить компилятору, где найти модуль Str при компиляции foo.ml. Для этого добавьте его в командную строку, используемую для компиляции foo.ml:

ocamlc str.cma foo.ml

или

ocamlopt str.cmxa foo.ml

List и другие модули из стандартной библиотеки доступны по умолчанию, поэтому вам не нужно сообщать компилятору о часто используемых модулях.

Ответ 2

Я думаю, вам нужно использовать директиву компилятора '-cclib'. Имя модуля не должно содержать файл, заканчивающийся как .cma. Ниже я попытался использовать модули unix и threads. Я думаю, вам нужно использовать некоторую комбинацию директив компилятора 'custom' и 'cclib'.

ocamlc -custom unix.cma threa.ml -cclib -lunix

Обратитесь к главе 7 этой книги за помощью: http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora063.html

И посмотрите на освещение директив компилятора здесь: http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual022.html#c:camlc

Ответ 3

ocamlc calc.ml str.cma -o calc
File "calc.ml", line 1:
Error: Error while linking calc.cmo:
Reference to undefined global `Str'

Код очень прост, чтобы вырезать швы.

let split_into_words s = 
    Str.split ( Str.regexp "[ \n\t]+") s ;;

let _ = 
    split_into_words "abc def ghi" ;;

В ocaml 4.0.2. Очевидно, что здесь есть проблема, но я слишком много начинаю, чтобы понять, что это такое. От toplevel, кажется, отлично работает С#load "str.cma", поэтому здесь мы ничего не понимаем. Кто-нибудь знает, что это такое?