Как скомпилировать с пользовательским модулем - PullRequest
1 голос
/ 14 сентября 2011

Я пытаюсь скомпилировать проект с 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

Ответы [ 3 ]

1 голос
/ 14 сентября 2011

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

1 голос
/ 10 ноября 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.

1 голос
/ 14 сентября 2011

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

...