我正在尝试使用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
答案 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
库。