分割コンパイル

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください