如何在OCaml文件中加载模块?

时间:2013-02-07 17:51:02

标签: functional-programming ocaml

我希望在我的OCaml Std文件中使用模块.ml

我尝试#load "Std",但编译器抱怨。

如何在OCaml中加载模块?

1 个答案:

答案 0 :(得分: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文件都在同一目录中,则只有一个参数就足够了。