ocamlbuild 以错误的顺序链接库
ocamlbuild links libraries in wrong order
我正试图在 OCaml 中使用来自 coq 库的 _CoqProject
解析器(如果该库不是用于外部使用,是吗?),但 ocamlbuild
似乎以错误的顺序链接库。
考虑这个最小的示例文件
open CoqProject_file
let x = read_project_file
coq.lib
包(与 coq
捆绑)以某种方式依赖于 threads
,following 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(绿色线程)来取消此选择,这在实践中很少使用。
我正试图在 OCaml 中使用来自 coq 库的 _CoqProject
解析器(如果该库不是用于外部使用,是吗?),但 ocamlbuild
似乎以错误的顺序链接库。
考虑这个最小的示例文件
open CoqProject_file
let x = read_project_file
coq.lib
包(与 coq
捆绑)以某种方式依赖于 threads
,following 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(绿色线程)来取消此选择,这在实践中很少使用。