使用';ocamlfind安装';然后在ocamlbuild中使用库

使用';ocamlfind安装';然后在ocamlbuild中使用库,ocaml,ocamlbuild,ocamlfind,Ocaml,Ocamlbuild,Ocamlfind,我按照说明使用ocamlfind install在site lib中设置并安装库。我有两个库:一个叫做逻辑,另一个叫做布尔。在每种情况下,我都在库中安装了.cmo、.cmx、.cmi和.mli文件,例如: ocamlfind install boolean META boolean.cmo boolean.cmx boolean.cmi boolean.mli 然后,当我使用ocamlbuild构建另一个依赖于逻辑和布尔值的项目时,我得到了以下错误消息: $ocamlbuild -use-oc

我按照说明使用ocamlfind install在site lib中设置并安装库。我有两个库:一个叫做逻辑,另一个叫做布尔。在每种情况下,我都在库中安装了.cmo、.cmx、.cmi和.mli文件,例如:

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.
然后,我将logic和boolean项目中的.o文件复制到site lib中各自的区域,并对其进行编译和链接

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

这是我的标签文件,以防它有帮助:

<*.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)
或“test_logic.native”或“test_loginc.byte”:包(boolean)、包(unix)、包(oUnit)、包(派生ocsigen)、包(派生ocsigen.syntax)、语法(camlp4o)、包(logic)
请参见:

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


我不知道细节,但是ocamlopt是一个本机编译器。它同时生成.o文件和.cmx文件。它们需要成对地放在一起。ocamlopt通过在内部运行链接器进行链接,并且通常使用gcc作为链接器。您可以看到它使用-verbose标志运行的命令。库中的.cmx文件(在site-lib/logic和site-lib/boolean中)是否足够?好吧,ocamlopt不是这样工作的。.o文件包含所有生成的代码。.cmx文件只是元信息。这很有用,因为您可以在.o文件上使用标准Unix工具。例如,您不需要特殊的链接器。