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

Jac*_*ale 1 ocaml functional-programming

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

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

如何在 OCaml 中加载模块?

did*_*erc 5

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

让我们考虑例如 file foo/moduleA.ml

let v = 1
Run Code Online (Sandbox Code Playgroud)

和文件bar/moduleB.ml

open ModuleA
let w = v
Run Code Online (Sandbox Code Playgroud)

命令:

$ cd foo
$ ocamlc -c moduleA.ml
$ cd ..
Run Code Online (Sandbox Code Playgroud)

将产生moduleA.cmomoduleA.cmi。前者是模块的字节码对象(类似于.o本机目标文件中的文件,但包含字节码数据和文本),后者是字节码编译头,由自动生成的.mli文件生成。这个字节码头对于编译器编译依赖于ModuleA.

$ cd bar
$ ocamlc -I ../foo -c moduleB.ml
$ cd ..
Run Code Online (Sandbox Code Playgroud)

将成功生成moduleB.cmo,这取决于ModuleA,因为前一个命令已经成功,并且因为我们使用-I命令行参数指示编译器在哪里查找依赖项,后跟第一个模块的路径。

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

$ ocamlc -I foo -I bar moduleA.cmo moduleB.cmo -o prog.byte
Run Code Online (Sandbox Code Playgroud)

模块必须按该顺序提供,以便让编译器首先知道依赖。这次的-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文件都在同一目录中,则只有一个参数就足够了。