我希望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
文件都在同一目录中,则只需一个参数就足够了。