使用'ocamlfind install'设置Ocaml库,然后在ocamlbuild中使用库

问题描述:

我按照指令​​设置使用ocamlfind安装在site-lib中安装库。我有两个库:一个叫逻辑,另一个叫布尔。在每一种情况下,我安装了.cmo,.cmx,.cmi和.mli库中的文件,例如:使用'ocamlfind install'设置Ocaml库,然后在ocamlbuild中使用库

ocamlfind install boolean META boolean.cmo boolean.cmx boolean.cmi boolean.mli 

然后,当我去建一个项目依赖于逻辑和布尔使用ocamlbuild,我得到了以下错误消息:

$ocamlbuild -use-ocamlfind test_logic.native -classic-display 
... 
/home/phil/godi-3.12.1.0/bin/ocamlfind ocamlopt -c -package boolean -package deriving- ocsigen -package deriving-ocsigen.syntax -package logic -package oUnit -package unix -syntax camlp4o -o test_logic.cmx test_logic.ml 
/home/phil/godi-3.12.1.0/bin/ocamlfind ocamlopt -linkpkg -linkpkg -package boolean -package deriving-ocsigen -package deriving-ocsigen.syntax -package logic -package oUnit -package unix -syntax camlp4o vhdl.cmx fsm.cmx test_logic.cmx -o test_logic.native 
+ /home/phil/godi-3.12.1.0/bin/ocamlfind ocamlopt -linkpkg -linkpkg -package boolean -package deriving-ocsigen -package deriving-ocsigen.syntax -package logic -package oUnit -package unix -syntax camlp4o vhdl.cmx fsm.cmx test_logic.cmx -o test_logic.native 
gcc: /home/phil/godi-3.12.1.0/lib/ocaml/site-lib/logic/logic.o: No such file or directory 
gcc: /home/phil/godi-3.12.1.0/lib/ocaml/site-lib/boolean/boolean.o: No such file or directory 
File "caml_startup", line 1, characters 0-1: 
Error: Error during linking 
Command exited with code 2. 

我再复制从逻辑和布尔项目.o文件在各自领域的站点lib和它编译和链接的罚款。

我想知道为什么.o文件是需要的,为什么gcc涉及到这里?

这里是我的_tags文件中的情况下,它可以帮助:

<*.ml> or "test_logic.native" or "test_loginc.byte": package(boolean),package(unix),  package(oUnit), package(deriving-ocsigen), package(deriving-ocsigen.syntax), syntax(camlp4o), package(logic) 
+0

我不知道细节,但ocamlopt是本地编译器。它会生成一个.o文件和一个.cmx文件。他们需要一起保持在一起。 ocamlopt通过在内部运行链接器进行链接,并且通常使用gcc作为链接器。你可以看到它使用-verbose标志运行的命令。 – 2012-04-25 06:18:09

+0

库中的.cmx文件(site-lib/logic和site-lib/boolean)不应该足够吗? – aneccodeal 2012-04-25 06:35:19

+0

好吧,ocamlopt不会那样工作。 .o文件包含所有生成的代码。 .cmx文件只是元信息。这很有用,因为你可以在.o文件上使用标准的Unix工具。例如,你不需要特殊的链接器。 – 2012-04-25 06:38:00

Section 11.1 of the OCaml Manual

从文件x.ml中,ocamlopt编译器生成两个文件:XO,包含原生对象代码,和x.cmx,包含用于链接和优化单元客户端的额外信息。编译的实现应该始终以名称x.cmx引用(当给定.o或.obj文件时,ocamlopt假定它包含从C编译的代码,而不是从Caml编译的代码)。