ocamlbuild 以错误的顺序链接库

ocamlbuild links libraries in wrong order

我正试图在 OCaml 中使用来自 coq 库的 _CoqProject 解析器(如果该库不是用于外部使用,是吗?),但 ocamlbuild 似乎以错误的顺序链接库。

考虑这个最小的示例文件

open CoqProject_file
let x = read_project_file

coq.lib 包(与 coq 捆绑)以某种方式依赖于 threadsfollowing this answer 建议为此使用 -tag thread,但我仍然链接 coq.lib 时出现以下错误 threads 未找到:

$ ocamlbuild -pkg coq.lib -tag thread -cflag -rectypes a.native                                                                                                             /tmp/p
+ /home/sam/.opam/4.06.0+coq-8.7/bin/ocamlopt.opt -I /home/sam/.opam/4.06.0+coq-8.7/lib/coq/config -I /home/sam/.opam/4.06.0+coq-8.7/lib/coq/lib -I /home/sam/.opam/4.06.0+coq-8.7/lib/ocaml /home/sam/.opam/4.06.0+coq-8.7/lib/ocaml/str.cmxa /home/sam/.opam/4.06.0+coq-8.7/lib/ocaml/unix.cmxa /home/sam/.opam/4.06.0+coq-8.7/lib/coq/lib/clib.cmxa -thread threads.cmxa a.cmx -o a.native
File "_none_", line 1:
Error: No implementations provided for the following modules:
         Thread referenced from /home/sam/.opam/4.06.0+coq-8.7/lib/coq/lib/clib.cmxa(Exninfo)
         Mutex referenced from /home/sam/.opam/4.06.0+coq-8.7/lib/coq/lib/clib.cmxa(Exninfo)
Command exited with code 2.

然而,如果我将 ocamlopt 调用分开并将 -thread threads.cmxa 放在 clib.cmxa

之前,则可以编译
$ cd _build/
$ /home/sam/.opam/4.06.0+coq-8.7/bin/ocamlopt.opt -I /home/sam/.opam/4.06.0+coq-8.7/lib/coq/config -I /home/sam/.opam/4.06.0+coq-8.7/lib/coq/lib -I /home/sam/.opam/4.06.0+coq-8.7/lib/ocaml /home/sam/.opam/4.06.0+coq-8.7/lib/ocaml/str.cmxa /home/sam/.opam/4.06.0+coq-8.7/lib/ocaml/unix.cmxa -thread threads.cmxa /home/sam/.opam/4.06.0+coq-8.7/lib/coq/lib/clib.cmxa a.cmx -o a.native

ocamlbuild的正确调用方式是什么?

如果您使用 ocamlfind 包,您应该使用 -use-ocamlfind 标志。

对于为什么需要 -tag thread,没有好的解决方案¹。 OCaml Threads 接口有两种不同的实现(一种是 os 线程,一种是绿色线程),coq.lib 取决于接口,但不会为用户决定使用哪一个,所以您必须手动指定它,例如使用 -tag thread.

¹:一种解决方案是通过弃用 vmthreads(绿色线程)来取消此选择,这在实践中很少使用。