1

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

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

如何在 OCaml 中加载模块?

4

1 回答 1

5

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

让我们考虑例如文件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文件都在同一目录中,则只需一个参数就足够了。

于 2013-02-07T18:45:57.693 回答