1

我正在尝试用 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
4

3 回答 3

1

每个 ml 源文件已经代表一个模块(名称与文件名相同)。仔细阅读关于模块的 ocaml 教程。

于 2011-09-14T12:04:44.060 回答
1

I found the solution :)

You have to change the right files "META" in the used libraries. In my case, the META file in the library odepack have to be changed by adding the following line

requires = "bigarray"

After that, a minor modification in the Makefile have to be done. The line

LIBS = unix str bigarray

is modified to

LIBS = str

This modification avoids the error

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

that occurs when we define the same library twice or more. The library Bigarray in my case is sufficient to include the Unix library.

于 2011-11-10T09:25:07.407 回答
1

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

于 2011-09-14T17:53:47.200 回答