1

StdOCaml.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>コンパイルの適切なフェーズにはを使用し、ライブラリの場合は2番目のフェーズ-I <location of std.cmo>std.cmaリンクフェーズ)にを使用する必要があります。ocamlc -I foo foo/moduleA.ml bar/moduleB.ml -o prog.byte両方のフェーズを1つのコマンド(つまり、)に組み合わせることができ、両方cmocmiファイルが同じディレクトリにある場合は、1つのパラメータだけで十分です。

于 2013-02-07T18:45:57.693 に答える