OCaml Batteries Includedのコンセプトと、私が見つけたほとんどのチュートリアルの進め方に少し不満を感じ、混乱しています。GODIのような「生産性」ツールを使用したり、ocamlcの呼び出しをocamlfindバッテリー/ ocamlcに置き換える前に(これは、現時点では私にはあまりにも魔法のようです)、OCamlバッテリーに含まれるライブラリのコアセットを簡単に使用できることを望んでいました。他のライブラリと同じように。そのために、私はgit(ヘッドハッシュ:9f94ecb)から最新のソースをダウンロードし、 makeallを実行しました。./_build/src/に3つの.cmaライブラリと102の.cmiがあることに気づきました。同じディレクトリ内のファイル。そのため、そのディレクトリを指す-Iスイッチを使用してコンパイルし、そこにある3つの.cmaライブラリのいずれかとリンクすることで、バッテリを「インストール」したり、プラットフォームツールを使用したりしなくても十分であると想定しました。それをテストするために、私はどこかで見つけた次の簡単なプログラムの実行可能ファイルを作成することに着手しました。
(* file euler001.ml *)
open BatEnum
open BatPervasives
let main () =
(1--999)
|> BatEnum.filter (fun i -> i mod 3 = 0 || i mod 5 == 0)
|> BatEnum.reduce (+)
|> BatInt.print stdout
let _ = main ()
私はそれをコンパイルすることができました:
ocamlc -c -I ../batteries-included/_build/src/ euler001.ml
しかし、私がリンクしようとしたとき:
ocamlc -o euler001 unix.cma nums.cma ../batteries-included/_build/src/batteries.cma euler001.cmo
私が得た:
ファイル"_none_"、1行目、文字0-1: エラー:../batteries-included/_build/src/batteries.cma(BatBigarray)のリンク中にエラーが発生しました: 外部関数`caml_ba_reshape'は使用できません
コマンドラインで追加したnums.cmaとunix.cmaは、リンカーが未定義のグローバルBig_intおよび(追加されたときの)Unixへの参照が欠落していることについて不平を言ったためです。しかし、これら2つのモジュールがリンカーの呼び出しで追加された後、最後のメッセージ(欠落している外部関数'caml_ba_reshape')を受け取りました。これは、ブロックされていることを証明しました。だから私は尋ねたいと思います:
- この特定のケースではどのように進めますか?
- 一般的な場合(つまり、リンカーが外部関数の欠落について不平を言う場合)はどのように進めますか?
- この方法で含まれているバッテリーを使用することは実行可能ですか?プラットフォームツールに頼る前に、問題が発生した場合に、標準のOCamlコンパイラとリンカーで基盤となるアーティファクト(cmaおよびcmi / mliファイル)を使用できることを保証したいと思います。