OCamlbuild无法编译抱怨的Netsys实现时没有提供

时间:2011-07-22 01:59:06

标签: ocaml ocamlbuild

我正在尝试使用ocamlbuild编译在OCaml中使用xmlrpc-light library编写的XML-RPC服务器,但我得到:

$ ocamlbuild server.native
Finished, 0 targets (0 cached) in 00:00:00.
+ ocamlfind ocamlopt -linkpkg -package xmlrpc-light -package unix -package threads -package netsys -thread server.cmx -o server.native
File "_none_", line 1, characters 0-1:
Error: No implementations provided for the following modules:
         Netsys referenced from /usr/lib/ocaml/equeue/equeue.cmxa(Uq_engines)
Command exited with code 2.
Compilation unsuccessful after building 4 targets (3 cached) in 00:00:00.

请注意,我有一个myocamlbuild.ml文件,如this one和一个_tags文件,其中包含一行:

<server.ml> or <server.native>: pkg_unix,pkg_netsys,pkg_xmlrpc-light,pkg_threads

在其他情况下(例如,对于同一客户端/服务器应用程序的client.native),此插件对我来说很好,但对于server.native则没有。投诉表明编译器无法使用库Netsys。但是我们得到了

$ ocamlfind query netsys
/usr/lib/ocaml/netsys

意味着netsys安装在/usr/lib/ocaml/netsys中。检查该目录给了我:

$ ls /usr/lib/ocaml/netsys
META  libnetsys.a  netsys.a  netsys.cma  netsys.cmi  netsys.cmxa  netsys.mli

此外,

$ ocamlfind list | grep netsys
netsys              (version: 2.2.9)

所以,确实安装了一个名为netsys的库,它确实有一个cmxa文件可供使用,但由于一些奇怪的原因,ocamlbuild抱怨没有为模块Netsys提供实现。 ocamlbuild可以读取/usr/lib/ocaml/equeue/equeue.cmxa的事实应该足以得出结论,在查找库方面,关于环境($ PATH等)的一切都应该没问题。

这完全在Debian 6.0中,我的OCaml版本是3.11.2。

经过一番浏览,我发现svn commit messagerepository diff)表明它可能与使用的线程数有关。事实上,我在代码中的某处使用了互斥锁(检查server.ml中的client.mlserver.ml的代码。如果我从我的pkg_threads中移除了Mutex内容,则仍会出现错误。但是,如果我另外从_tags文件中删除xmlrpc-light,那么一切都会编译。所以,我的结论是我不能直接使用带有{{1}}的线程库,这很奇怪。

1 个答案:

答案 0 :(得分:1)

IMHO equeue META错了。将netsys添加到依赖项可以解决您的问题:

sed -i 's/threads/netsys,threads/' /usr/lib/ocaml/equeue/META