我正在尝试使用 ocamlbuild 编译使用 OCaml 中的xmlrpc-light 库编写的 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
像这样的文件和一个_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 提交消息(存储库差异),这表明它可能与使用的线程数有关。而且,事实上,我在我的代码中的某处使用了 Mutex(检查代码和server.ml
另一个问题)。如果我从我的错误中删除 Mutex 的东西,错误仍然会发生。但是如果我另外从文件中删除,那么一切都会编译。所以,我的结论是我不能直接使用线程库,这很奇怪。client.ml
server.ml
pkg_threads
_tags
xmlrpc-light