我对 OCaml Batteries Included 概念和我能找到的大多数教程的继续方式感到有点沮丧和困惑。在我开始使用像 GODI 这样的“生产力”工具或用ocamlfind 电池/ocamlc替换ocamlc的调用之前(在这一点上,这对我来说太神奇了)我希望能够简单地使用 OCaml Batteries Included core set of libraries像任何其他图书馆一样。为此,我从git下载了最新的源代码(head hash: 9f94ecb)并做了一个make all。我注意到我在./_build/src/获得了三个.cma库以及 102 个.cmi同一目录下的文件。因此,我假设使用指向该目录的 -I 开关进行编译并与发现的三个.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是因为链接器抱怨缺少对 undefined global Big_int和(添加时)对Unix的引用。但是在链接器调用中添加了这两个模块之后,我收到了最后一条消息(在缺少的外部函数'caml_ba_reshape'上),这证明对我来说是阻塞的。所以我想问:
- 在这种特殊情况下如何进行?
- 在一般情况下如何进行(即当链接器抱怨缺少外部函数时)
- 以这种方式使用包含的电池是否可行?在我依赖平台工具之前,我想确保如果遇到问题,我可以将底层工件(cma 和 cmi/mli 文件)与标准 OCaml 编译器和链接器一起使用。