ソースファイルは1つじゃなくてもいい。次の例では,fact関数を定義している fact.ml と,それを呼び出す main.ml に分けている。
fact.ml
let rec fact n = if n = 0 then 1 else n * fact (n-1)
main.ml
let () = print_int (Fact.fact 5)
OCamlではファイル=モジュール(ストラクチャ)なので,fact.mlに定義されているfact関数は,Fact.fact として呼び出すか,open Fact してから使う。
さて,それぞれを(リンクせずに)コンパイルするには -c オプションを使う。
^o^ >ocamlc -c fact.ml ^o^ >ocamlc -c main.ml ^o^ >ls fact.cmi fact.cmo fact.ml main.cmi main.cmo main.ml
.cmo と .cmi という2種類のファイルができている。 .cmo がオブジェクトファイルだ。
これらをリンクして実行形式のファイルを作るには,ソースファイルから直接コンパイルするときと同じようにすればいい。
^o^ >ocamlc -o fact5.exe fact.cmo main.cmo ^o^ >ls *.exe fact5.exe
単にリンクする.cmoファイルを並べるだけだけど,参照される側(ここではfact.cmo)を先に書くことに注意。逆にするとエラーになる。
^o^ >ocamlc -o fact5.exe main.cmo fact.cmo Error while linking main.cmo: Reference to undefined global `Fact'
さて,うまくいってるだろうか。
^o^ >fact5 120