我对OCaml Batteries Included的概念和大多数教程的处理方式感到有些沮丧和困惑。在使用“生产力”工具(如GODI)或将ocamlc的调用替换为ocamlfind batteries/ocamlc之前(此时对我来说太神奇了),我希望能够像使用其他库一样简单地使用OCaml Batteries Included核心库集。为此,我从git(head hash:9f94ecb)下载了最新的源代码并执行了make all。我注意到在./_build/src/目录下得到了三个.cma库,以及同一目录中的102个.cmi文件。因此,我假设编译时使用指向该目录的-I开关,并链接其中一个找到的三个.cma库,就足够了,而不需要“安装”Batteries或使用平台工具。为了测试这一点,我开始为以下简单程序生成可执行文件:
(* 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
我得到了错误信息:
File "_none_", line 1, characters 0-1: Error: Error while linking ../batteries-included/_build/src/batteries.cma(BatBigarray): The external function `caml_ba_reshape' is not available 我在命令行中添加了nums.cma和unix.cma,因为链接器抱怨缺少对未定义全局变量Big_int的引用(在添加后),以及对Unix的引用。但是,在这两个模块被添加到链接器调用后,我收到了最后一个消息(关于缺少外部函数'caml_ba_reshape'),这对我来说是一个阻碍。所以我想问一下:
- 在这种特定情况下,应该怎么做?
- 在一般情况下(即当链接器抱怨缺少外部函数时),应该怎么做?
- 以这种方式使用Batteries Included是否可行?在依赖平台工具之前,我想确保如果遇到问题,可以使用标准的OCaml编译器和链接器来使用底层构件(cma和cmi/mli文件)。