Ошибка подключения модуля в 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", поэтому здесь мы ничего не понимаем. Кто-нибудь знает, что это такое?