Jac*_*ale 1 ocaml functional-programming
我希望Std在我的 OCaml.ml文件中使用模块。
我试过了#load "Std",但编译器抱怨。
如何在 OCaml 中加载模块?
您必须首先编译要包含的模块,将编译文件的位置提供给依赖它的模块的编译命令,然后在最终编译命令行中提供它。
让我们考虑例如 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.cmo和moduleA.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),并且如果cmo和cmi文件都在同一目录中,则只有一个参数就足够了。