2

で小さなプロジェクトを書きましたOCaml

私は2つのフォルダを持っています:

./myUnionFind. 中にファイルがありますmyUnionFind.ml

./percolation. 内部には と の 2 つのファイルがありmyPercolation.mlますpercolation_stats.ml


myUnionFind.mlモジュールとして動作します。

myPercolation.mlMyUnionFindモジュールとしても機能しますが、 で定義されたモジュールを使用しますmyUnionFind.ml

percolation_stats.mlを使用しmyPercolation.mlます。

何よりも一緒に、私も使っていますBatteries


それらをすべてコンパイルして動作させ、実行可能ファイルを取得したいと考えていますrun

しかし、どのように?

私は次のことを試しました:

フォルダ内./percolation、やったocamlfind ocamlc -package batteries -linkpkg ../myUnionFind/myUnionFind.ml myPercolation.ml percolation_stats.ml -o run

失敗して と言いFile "myPercolation.ml", line 1, characters 0-16: Error: Unbound module MyUnionFindましたが、そのフォルダ../myUnionFindを含めましたよね?


また、一度だけコンパイルしたい場合、./myUnionFind/myUnionFind.ml毎回ではなく何度もコンパイルされるようにするにはどうすればよいmyUnionFind.mlですか?

4

1 に答える 1

2

内部では、コンパイル済みユニットにmyUnionFindコンパイルする必要があります。myUnionfind.ml

cd myUnionFind
ocamlc -c myUnionFind.ml

これによりmyUnionFind.cmo、コンパイルされた実装を格納する、、およびコンパイルされたインターフェイスmyUnionFind.cmiを格納するが生成されます。を使用する他のモジュールは、 atタイプチェックタイプにアクセスする必要があります。MyUnionFindcmi

percolation内では、次のようにしてmyPercolation.mlをモジュールにコンパイルできます。

cd percolation ocamlc -I ../myUnionFind -c myPercolation.ml

ここでも、.cmoと.cmiの両方を取得します。コンパイラが検索パスでmyUnionFind.cmiを自動的に検索し、-Iオプションのためにそれを見つけたことに注意してください。

その後、コンパイルできますpercolation_stats(以前の両方のコンパイルユニットに依存します)

ocamlc -I ../myUnionFind -c percolation_stats.ml

最後に、結果の3つの.cmoをリンクして、実行可能ファイルを作成します。

ocamlc ../myUnionFind.cmo myPercolation.cmo percolation_stats.cmo -o run

(バッテリーを使用する場合は、各コマンドをでラップしますocamlfind ocamlc -package batteriesが、リンクコマンドのみをでラップしますlinkpkg)。

このプロセスを簡単にするには:

  • ocamlbuild現在のプロジェクトのすべてのファイルを見つけてコンパイルし、実行可能ファイルを作成するのが得意です。percolationディレクトリ内に、存在ocamlbuild percolation_stats.byteするすべてのものを含む実行可能ファイルを生成できます

  • ただしmyUnionFind、外部ライブラリとして使用する場合は、からインストールしfindlibて指定しやすくするために、を使用してインストールするのが最善の方法percolationです。findlibパッケージを作成する方法(非常に簡単です)については、この古い回答を参照してください。

  • myUnionFindがfindlibパッケージになると、実行可能ファイルを取得するには1つのコマンドocamlbuild -use-ocamlfind -pkgs batteries,my-union-find percolation_stats.byte(または.native)で十分です。

于 2013-02-19T15:55:21.297 に答える