私の問題は、ocamlcとocamloptapearがapt-getを介してインストールされたサードパーティライブラリの検索を拒否していることです。サードパーティのモジュールを自分のOCamlプログラムに取り込もうとしたときに最初にこの問題が発生し始め、OCamlのコンパイルを理解するのに個人的に失敗したとしてすぐにそれを書き留めました。すぐに-しかし-私は自分の指示の下で他の人々のプロジェクトをコンパイルしようとしたときに同じ問題に遭遇することに気づきました。
これが最も簡単な例です。他のものはすべてocamlbuildを使用しますが、これは物事を少しわかりにくくします。
プログラム: http://groups.google.com/group/fa.caml/msg/5aee553df34548e2
コンパイル:
$ocamlc -g -dtypes -pp camlp4oof -I +camlp4 dynlink.cma camlp4lib.cma -cc g++ llvm.cma llvm_bitwriter.cma minml.ml -o minml
File "minml.ml", line 43, characters 0-9:
Error:Unbound module Llvm
私がocamlcにllvmファイルへの絶対パスを提供するときでさえ、そのように...
$ ocamlc -g -dtypes -pp camlp4oof -I +camlp4 dynlink.cma camlp4lib.cma -cc g++ /usr/lib/ocaml/llvm-2.7/llvm.cma /usr/lib/ocaml/llvm-2.7/llvm_bitwriter.cma minml.ml -o minml
... 無駄に。
私は何が間違っているのですか?
コマンドは2つのことを実行しています。minml.ml
を(minml.cmo
に)コンパイルしてから、結果のオブジェクトをminml
にリンクします。
モジュールをコンパイルするには、依存関係のinterfacesが必要です。インターフェイスには、タイプチェッカーとコードジェネレーターの両方に必要な入力情報が含まれています。この情報は実装では繰り返されません(ここでは.cma
)。したがって、コンパイル段階では、llvm.cmi
が使用可能である必要があります。コンパイラはインクルードパスでそれを探すので、追加の-I +llvm-2.7
(-I /usr/lib/ocaml/llvm-2.7
の略)が必要です。
リンクステージには、モジュールのバイトコード実装を含むllvm.cma
が必要です。ここでは、-I
を使用するか、フルパスを指定してocamlc
にファイルの場所を知らせることができます。
ocamlc -g -dtypes -I +camlp4 -I +llvm-2.7 -pp camlp4oof -c minml.ml
ocamlc -g -cc g++ -I +camlp4 -I +llvm-2.7 dynlink.cma camlp4lib.cma llvm.cma llvm_bitwriter.cma minml.cmo -o minml
または、1つのコマンドで両方のステージを実行する場合:
ocamlc -g -dtypes -cc g++ -I +camlp4 -I +llvm-2.7 dynlink.cma camlp4lib.cma llvm.cma llvm_bitwriter.cma -pp camlp4oof minml.ml -o minml