OCaml中的未绑定模块

时间:2010-10-03 06:56:08

标签: module ocaml compiler-errors

我的问题是ocamlc和ocamlopt apear 拒绝找到通过apt-get安装的第三方库。当我尝试将第三方模块合并到我自己的OCaml程序中时,我首先遇到了这个问题,并且很快将其写成个人未能理解OCaml编译。很快 - 然而 - 当我试图按照自己的指示编译其他人的项目时,我发现自己遇到了同样的问题。

这是最直接的例子。其他人都使用ocamlbuild,这会使事情变得模糊不清。

该计划:http://groups.google.com/group/fa.caml/msg/5aee553df34548e2

汇编:

$ocamlc -g -dtypes -pp camlp4oof -I +camlp4 dynlink.cma camlp4lib.cma -cc g++ llvm.cma llvm_bitwriter.cma minml.ml -o minml
File "minml.ml", line 43, characters 0-9:
Error:Unbound module Llvm

即使我提供ocamlc与llvm文件的绝对路径,就像这样......

$ ocamlc -g -dtypes -pp camlp4oof -I +camlp4 dynlink.cma camlp4lib.cma -cc g++ /usr/lib/ocaml/llvm-2.7/llvm.cma /usr/lib/ocaml/llvm-2.7/llvm_bitwriter.cma minml.ml -o minml 

......无济于事。

我做错了什么?

1 个答案:

答案 0 :(得分:17)

您的命令正在做两件事:它正在编译minml.ml(进入minml.cmo),然后将生成的对象链接到minml

编译模块需要依赖项的 interfaces 。接口包含类型检查器和代码生成器所必需的类型信息;实现中不会重复此信息(.cma此处)。因此,对于编译阶段,llvm.cmi必须可用。编译器在包含路径中查找它,因此您需要额外的-I +llvm-2.7(这是-I /usr/lib/ocaml/llvm-2.7的缩写)。

链接阶段需要llvm.cma,其中包含模块的字节码实现。在这里,您可以使用-I或提供完整路径,让ocamlc知道在哪里找到该文件。

ocamlc -g -dtypes -I +camlp4 -I +llvm-2.7 -pp camlp4oof -c minml.ml
ocamlc -g -cc g++ -I +camlp4 -I +llvm-2.7 dynlink.cma camlp4lib.cma llvm.cma llvm_bitwriter.cma  minml.cmo -o minml

或者如果您想在一个命令中执行这两个阶段:

ocamlc -g -dtypes -cc g++ -I +camlp4 -I +llvm-2.7 dynlink.cma camlp4lib.cma llvm.cma llvm_bitwriter.cma -pp camlp4oof minml.ml -o minml