Использование OCaml Batteries Included как ванильный CMA

Я немного расстроен и сбит с толку концепцией 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'), которое оказалось блокирующим для меня. Поэтому я хотел бы спросить:

  1. как поступить в данном конкретном случае?
  2. как поступают в общем случае (т.е. когда компоновщик жалуется на отсутствие внешней функции)
  3. Можно ли использовать встроенные батареи таким образом? Прежде чем полагаться на инструменты платформы, я хочу быть уверенным, что смогу использовать базовые артефакты (файлы cma и cmi/mli) со стандартным компилятором и компоновщиком OCaml, если возникнут проблемы.

9
задан Marcus Junius Brutus 19 May 2012 в 17:17
поделиться