如何使用自定义模块进行编译

时间:2011-09-14 10:29:47

标签: module makefile ocaml ml

我正在尝试使用2 .ml编译一个项目,其中一个是以下格式的模块

module Mymodule =  
  struct  
  ...  
  end;; 

我还为myModule创建了一个.mli

module Mymodule =  
  sig  
  ...  
  end 

但是现在当我在main.ml中调用Mymodule.myfunction时,我得到"Unbound value Mymodule.myfunction"

这是我的makefile(我也有标准的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 个答案:

答案 0 :(得分:1)

每个ml源文件已经代表一个模块(名称等于文件名)。 仔细阅读ocaml tutorial on modules

答案 1 :(得分:1)

要放大ygrek的答案,通过在名为Mymodule.ml的文件中声明一个名为Mymodule的模块,您将创建一个名为Mymodule.Mymodule的模块。很可能你只想删除.ml和.mli文件中的module Mymodule包装器,然后事情会按预期工作。从本质上讲,OCaml为每个源文件免费提供一层模块包装。

答案 2 :(得分:1)

我找到了解决方案:)

您必须在使用的库中更改正确的文件“META”。就我而言,必须通过添加以下行来更改库odepack中的META文件

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库。