2011-12-25 8 views
4

私はlibrary.cにラッピングを提供するmylibrary.mlを持っています。私はバイトコードコンパイルして他のocamlコードのライブラリとしてmylibrary.mlを提供したいと思います。これをバイトコードにコンパイルすると(そして、ここではocamlをネイティブコードにコンパイルすることは考えていません)、多数のファイルが生成され、それらをすべて保持する理由があるのだろうかと思います。または、それらをライブラリの他のユーザーにすべて提供することはできますか?.cmoまたは.cmaのみを保持する理由はありますか?

私は(今のところ)私は

ocaml mylibrary.cma 

としてOCamlのトップレベルでてMyLibraryを使用したりすることをできるようにバイトコードライブラリオブジェクトmylibrary.cmaが必要であることを理解し、私のocamlからでき

#load "mylibrary.cma";; 

スクリプト。次に、コンパイルされたインターフェイスmylibrary.cmidllmylibrary.so(コードのC部分を含む)も上記の動作に必要です。また、コンパイルされていないインタフェース定義ファイルmylibrary.mliは、文書化のために保管しておくといいです。

mylibrary.cmaファイルをお持ちの場合でも、mylibrary.cmoファイルを保持する理由はありますか?どのような場合に誰かがそれを持っていることを望むでしょうか?

編集:私は意味、私はメイクファイルで.cmoを構築し、その後.cmaを構築するためにそれを使用する必要がありますが、私はわずかクリーナーディレクトリを維持するために、この後.cmoを削除するために考えていました。

答えて

3

を保つことができますバイトコードコンパイラ):

mylibrary.mli - 人間が読めるインターフェイス定義(厳密には必要ではなく、コンパイラのみが必要です。CMI)
mylibrary.cmi - てMyLibrary
library.oを呼び出すコードをコンパイルするときに必要なコンパイルされたインターフェース、 - Cオブジェクトファイル
dlllibrary.soから.o
dlllibrary.aからなる共有ライブラリオブジェクト - .o
mylibrary.cmo製のスタティックライブラリオブジェクト - バイトコードオブジェクトバイトコードライブラリは、次に

からmylibrary.ml
mylibrary.cmaからコンパイルトップレベルからてMyLibraryをロードする際に必要とされている(mylibrary.cmidlllibrary.so付き):

#load "mylibrary.cma";;

OR

一つ

が動的に mylibrary.cmamylibrary.cmiとも必要 dlllibrary.so)とリンクバイトコードプログラムをコンパイルすることができます:

ocamlc mylibrary.cma <program>.ml

OR注意

ocamlc dlllibrary.so mylibrary.cmo <program>.ml

(::その後でバイトコードを実行します。ocamlrun -I . <program>dlllibrary.soと仮定するとしている動的代わりにバイトコードライブラリ(:mylibrary.cmomylibrary.cmidlllibrary.so必要なファイル)の、バイトコードオブジェクトとリンク

現在のディレクトリ)

または

objeと静的にリンクするCTS(必要なファイル:mylibrary.cmomylibrary.cmiliblibrary.a

ocamlc -custom liblibrary.a mylibrary.cmo <program>.ml

OR

静的ライブラリオブジェクトとリンク(必要なファイル:mylibrary.cmamylibrary.cmiliblibrary.a

ocamlc -custom -I . mylibrary.cma <program>.ml

だから依存将来どのようにライブラリを使用するかについて異なるファイルが必要です。 .mliは人間の読者にのみ必要であり、Cライブラリからコンパイルされたオブジェクトファイル.oは必要ありません(場合によってはネイティブコードにコンパイルするときに必要になります)。

2

ライブラリのソースコードを保存しておく必要があります。 Ocamlコンパイラ(例えば3.12から将来の3.13)をアップグレードする場合、非常に頻繁に、*.cmoまたは*.cmaファイルは再コンパイルなしでは動作しません。

あなたがきれい常にできると仮定すると、再コンパイルのもの(例えば次の2つの伝統的な目標cleanmakeからallを持っている)にこれを制限するときにのみ、(異なるファイルの明らかに目的がある、だから、*.cma

+1

もちろん、私はソースを保持します。私はちょうど考えていた、誰かが.cmaの代わりに.cmoを使用したい場合があるかどうかです。 –

関連する問題