Я немного расстроен и сбит с толку концепцией OCaml Batteries Included и тем, как действует большинство руководств, которые я смог найти. Прежде чем я смогу использовать инструменты «производительности», такие как GODI, или заменить вызовы ocamlcна ocamlfind battery/ocamlc(что на данный момент для меня слишком волшебно), я надеялся иметь возможность просто использовать базовый набор библиотек OCaml Batteries Included, как и любую другую библиотеку. С этой целью я загрузил последний исходный код из git(head hash: 9f94ecb) и сделал make all. Я заметил, что у меня есть три библиотеки .cmaв ./_build/src/вместе со 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
, я получил:
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я добавил в командную строку, потому что компоновщик жаловался на отсутствие ссылок на undefined global Big_intи (когда это было добавлено ) в Unix.Но после того, как эти два модуля были добавлены при вызове компоновщика, я получил последнее сообщение (об отсутствующей внешней функции 'caml_ba_reshape'), которое оказалось блокирующим для меня. Поэтому я хотел бы спросить: