OCamlbuild не может скомпилировать жалобу, что реализация Netsys не предоставляется, когда она - PullRequest
4 голосов
/ 22 июля 2011

Я пытаюсь скомпилировать сервер XML-RPC, написанный с использованием библиотеки xmlrpc-light в OCaml, с помощью ocamlbuild, но получаю:

$ 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 commit ( diff репозитория ), которое предполагает, что оно может иметь отношение к количеству используемых потоков. И, фактически, я использую Mutex где-то в моем коде (проверьте код server.ml и client.ml в этот другой вопрос ). Если я уберу материал Mutex из моего server.ml, ошибка все равно произойдет. Но если я дополнительно удалю pkg_threads из файла _tags, то все компилируется. Итак, я пришел к выводу, что я не могу напрямую использовать библиотеку потоков с xmlrpc-light, что странно.

1 Ответ

1 голос
/ 27 июля 2011

ИМХО, эквай МЕТА неверен Добавление netsys к зависимостям устраняет вашу проблему:

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