我的问题是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
......无济于事。
我做错了什么?
答案 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