2013-02-07 28 views
1

我希望在我的OCaml .ml文件中使用模块Std。我试过#load "Std",但编译器抱怨。如何在OCaml文件中加载模块?

如何在OCaml中加载模块?

+0

'#'指令并非真正用于编译的项目。这是编译行的问题。 – nlucaroni

+0

那我该如何使用'Std'模块? –

+0

尽管didierc提到使用“open”,但它被认为是不好的做法(除了在本地环境中)。这是因为可以覆盖先前声明的函数。你应该在答案中调用'ModuleA.v'。它更清晰,代码复杂,你知道'v'来自哪里。 – nlucaroni

回答

4

您必须首先编译您希望包含的模块,然后将编译文件的位置提供给模块的编译命令(取决于它),然后在最终编译命令行中提供它。

让我们看看以下实例文件foo/moduleA.ml

let v = 1 

和文件bar/moduleB.ml

open ModuleA 
let w = v 

的命令:

$ cd foo 
$ ocamlc -c moduleA.ml 
$ cd .. 

会产生moduleA.cmomoduleA.cmi。前者是模块的字节码对象(如原始对象文件中的.o文件,但包含字节码数据和文本),后者是由自动生成的.mli文件生成的字节码编译头。该字节码头是编译器编译依赖于ModuleA的文件所必需的。

$ cd bar 
$ ocamlc -I ../foo -c moduleB.ml 
$ cd .. 

将生产moduleB.cmo,这取决于ModuleA成功,因为先前的命令已经成功,因为我们指示编译器到哪里寻找与-I命令行参数的依赖关系,其次的路径第一个模块。

最后的命令下面将从两个模块生成的字节码可执行文件:

$ ocamlc -I foo -I bar moduleA.cmo moduleB.cmo -o prog.byte 

模块必须按照这个顺序来提供,让编译器知道依赖关系第一。此时参数-I指示在哪里可以找到.cmo文件。

在你的情况,你必须因此使用-I <location of std.cmi>为编辑正确的相位和-I <location of std.cmo>(或std.cma,如果它是一个库),第二阶段(链接阶段)。如果您可以在一个命令(即ocamlc -I foo foo/moduleA.ml bar/moduleB.ml -o prog.byte)中组合两个阶段,并且如果cmocmi文件都在同一个目录中,则只有一个参数就足够了。