Как скомпилировать с помощью пользовательского модуля

Я пытаюсь скомпилировать проект с 2 .ml, и один из них представляет собой модуль в этом формате.

module Mymodule =  
  struct  
  ...  
  end;; 

Я также создал .mli для myModule

module Mymodule =  
  sig  
  ...  
  end 

Но теперь, когда я вызываю Mymodule.myfunction в main.ml, я получаю "Unbound value Mymodule.myfunction".

Вот мой make-файл (у меня также есть стандартный OcamlMakeFile):

RESULT= result  
SOURCES= Mymodule.ml main.ml  
LIBS= bigarray sdl sdlloader sdlttf sdlmixer

INCDIRS= +sdl

include OCamlMakefile

Я искал и пробовал кое-что, но ничего не работает :(


Спасибо за ваш ответ, я следил за учебником, на который вы ссылались, но теперь у меня проблема с привязкой SDL:

File "testsdl_2.ml", line 1, characters 0-1:
Error: No implementations provided for the following modules:
         Sdl referenced from testsdl_2.cmx
         Sdlloader referenced from testsdl_2.cmx
         Sdlvideo referenced from testsdl_2.cmx

и я использую эту строку для компиляции:

ocamlopt -I +sdl -o testsdl mymodule.cmx main.ml

person JohnnyCrash    schedule 14.09.2011    source источник


Ответы (3)


Каждый исходный файл ml уже представляет собой модуль (с именем, равным имени файла). Внимательно прочитайте руководство по модулям ocaml.

person ygrek    schedule 14.09.2011

Чтобы немного расширить ответ ygrek, объявив модуль с именем Mymodule внутри файла с именем Mymodule.ml, вы создаете модуль с именем Mymodule.Mymodule. Скорее всего, вы просто хотите удалить обертки module Mymodule в файлах .ml и .mli, и тогда все будет работать так, как вы ожидаете. По сути, OCaml бесплатно предоставляет один слой модуля для каждого исходного файла.

person Jeffrey Scofield    schedule 14.09.2011

Я нашел решение :)

Вы должны изменить правильные файлы "META" в используемых библиотеках. В моем случае файл META в библиотеке odepack нужно изменить, добавив следующую строку

requires = "bigarray"

После этого необходимо внести небольшие изменения в Makefile. Линия

LIBS = unix str bigarray

изменен на

LIBS = str

Эта модификация позволяет избежать ошибки

File "_none_", line 1, characters 0-1:
Error: Files /usr/lib/ocaml/unix.cmxa and /usr/lib/ocaml/unix.cmxa
   both define a module named Unix

это происходит, когда мы определяем одну и ту же библиотеку дважды или более. Библиотеки Bigarray в моем случае достаточно для включения библиотеки Unix.

person Community    schedule 10.11.2011