分割コンパイル

ソースファイルは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