我希望Std在我的 OCaml.ml文件中使用模块。
我试过#load "Std"了,但编译器抱怨。
如何在 OCaml 中加载模块?
您必须首先编译您希望包含的模块,将编译文件的位置提供给依赖它的模块的编译命令,然后在最终的编译命令行中提供它。
让我们考虑例如文件foo/moduleA.ml:
let v = 1
和文件bar/moduleB.ml:
open ModuleA
let w = v
命令:
$ cd foo
$ ocamlc -c moduleA.ml
$ cd ..
将产生moduleA.cmo和moduleA.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),并且如果cmo和cmi文件都在同一目录中,则只需一个参数就足够了。