包含的OCaml电池无法在Mac OS X 10.6.6上构建

时间:2011-02-24 12:05:41

标签: macos ocaml

我尝试在我的Mac OS X 10.6.6(MacBook Air3,2)上构建包含1.3.0的OCaml电池,但不能。 OCaml本身和拒绝库版本如下:

  • OCaml:3.11.2
  • findlib:1.2.6
  • OUnit:1.1.0
  • 甘菊:0.8.1
  • 制作:3.81

我没有使用GODI进行安装。有没有人在你的Mac上运行OCaml电池,如果有的话,你能告诉我你的库版本吗?此外,您能找到解决此错误的任何解决方案吗?

% make all
cp -f src/batCamomile-0.8.1.ml src/batCamomile.ml
test ! -e src/batteries_config.ml || rm src/batteries_config.ml
ocamlbuild syntax.otarget byte.otarget src/batteries_help.cmo META shared.otarget
Finished, 0 targets (0 cached) in 00:00:00.
+ ocamlfind ocamlopt -shared -linkall -package camomile,num,str -o src/batteries_uni.cmxs src/batteries_uni.cmxa
ld: warning: -read_only_relocs cannot be used with x86_64
ld: codegen problem, can't use rel32 to external symbol _caml_negf_mask in .L101 from src/batteries_uni.a(batFloat.o)
collect2: ld returned 1 exit status
File "caml_startup", line 1, characters 0-1:
Error: Error during linking
Command exited with code 2.
Compilation unsuccessful after building 479 targets (478 cached) in 00:00:01.
make: *** [all] Error 10

谢谢, Yoshi a.k.a. ymotongpoo

2 个答案:

答案 0 :(得分:1)

在Mac OS上,您必须禁用本机共享库构建。使用Make BATTERIES_NATIVE_SHLIB=no参数来完成此任务:

$ make all install BATTERIES_NATIVE_SHLIB=no

GODI软件包默认在Mac上设置此参数,但您必须自行从源代码构建时手动设置它。 您需要在每次调用make 时设置此参数(或将其设置为环境变量)。

最后,我强烈推荐使用GODI。它使管理OCaml安装变得比手工操作容易得多。

答案 1 :(得分:1)

我向错误跟踪器报告,make test qtest失败的原因是echo命令的-n选项。 https://github.com/ocaml-batteries-team/batteries-included/issues#issue/122

首先在OS X中,必须设置选项BATTERIES_NATIVE_SHLIB=false。而且,您需要修改Makefile才能成功运行测试。 存储库中的最新版本已修复,但如果要构建1.3.0 tarball,请按如下方式修改Makefile:

#put all the testing modules in a library
qtest/test_mods.mllib: $(TESTABLE)
-  echo -n "Quickcheck Tests \c" > $@
+  echo "Quickcheck Tests \c" > $@
   echo $(patsubst src/%.ml,%_t, $(TESTABLE)) >> $@

或者,您可以使用/bin/echo

#put all the testing modules in a library
qtest/test_mods.mllib: $(TESTABLE)
-  echo -n "Quickcheck Tests \c" > $@
+  /bin/echo -n "Quickcheck Tests \c" > $@
   echo $(patsubst src/%.ml,%_t, $(TESTABLE)) >> $@

两种方式都有效。