Почему сторонние библиотеки не найдены в пути поиска OCaml?

Моя конфигурация выглядит следующим образом:

OCaml устанавливается Homebrew в соответствии с рецептом по умолчанию. Он находится в /usr/local/Cellar/objective-caml/3.12.0/[bin,lib,share], содержимое которого связано с /usr/local/[bin,lib,share].

Сторонняя библиотека (LLVM) установила символические ссылки в /usr/local/lib/ocaml/*. Важно отметить, что /usr/local/lib/ocaml сама по себе является не символической ссылкой на Homebrew Cellar, а папкой, содержащей ссылки на отдельные файлы по пути OCaml Cellar, поэтому эти файлы сторонних библиотек находятся в пути /usr/local/lib/ocaml/, а не в исходном путь

Стандартные компиляторы/интерпретаторы/инструменты сборки OCaml постоянно не могут найти эти сторонние библиотеки, если они явно не указаны там (например, с помощью ocamlbuild -cflags -I,/usr/local/lib/ocaml).

ld.conf перечисляет:

/usr/local/lib/ocaml/stublibs
/usr/local/lib/ocaml
/usr/local/lib/ocaml/site-lib/pcre

что, казалось бы, предполагает, что путь поиска компилятора установлен правильно, но я не знаком с внутренней работой цепочки инструментов.

  • Это известная проблема?
  • Есть ли способ распечатать пути поиска OCaml, фактически используемые стандартными инструментами?
  • Предполагая, что это следствие Homebrew configure и процесса установки (т.е. если предположить, что проблема заключается в OCaml, как настроено, предполагая, что его фактический путь к библиотеке /usr/local/Cellar/objective-caml/3.12.0/lib/ocaml, а не /usr/local/lib/ocaml), возможно ли принудительно добавить дополнительные пути поиска вне --prefix во время конфигурация?
  • Можно ли после установки расширить пути поиска для всей среды (путем редактирования конфигурационных файлов, а не прибегать к возможной переустановке)?

person jrk    schedule 12.05.2011    source источник


Ответы (4)


Единственный встроенный путь поиска модулей ocaml — это путь к stdlib — смотрите его с помощью ocamlc -where. Пути, указанные в ld.conf, используются для поиска stublibs — кода C, скомпилированного в динамически загружаемые модули для программ ocaml с байт-кодом, использующих привязки C (без пользовательской среды выполнения). Невозможно «расширить» пути поиска по всему миру при установке ocaml.

Правильный способ — добавить необходимые пути включения при вызове инструментов ocaml. Инструмент ocamlfind очень помогает сделать это независимым от системы способом. Например.:

ocamlfind ocamlc -linkpkg -package llvm ll.ml -o ll

Системы сборки высокого уровня, такие как oasis/ocamlbuild/omake/etc, полностью скрывают все эти вещи, и пользователю нужно только указать имена зависимых пакетов.

person ygrek    schedule 13.05.2011
comment
ocamlc -where действительно сообщает о расположении подвала: /usr/local/Cellar/objective-caml/3.12.0/lib/ocaml. И похоже, что llvm не устанавливает META-файл findlib, что объясняет его отсутствие. Ваше предложение ocamlfind не решает проблему, предположительно по этой причине. - person jrk; 13.05.2011

Действительно, как указал ygrek, ответ ocamlfind. OCamlfind поддерживает список пакетов OCaml с поддержкой findlib¹, установленных в вашей системе, и их легко связать. Использовать

ocamlfind list

Чтобы получить список пакетов, которые можно передать на grep и т.д.

ocamlfind query mypackage

Чтобы получить путь установки пакета (подробнее см. ocamlfind query --help)

ocamlfind ocamlc -package mypackage .....

Чтобы скомпилировать что-то, используя пакет в качестве зависимости (-linkpkg используется на последнем этапе компоновки для сборки исполняемого файла, например, с -c -o foo.cmo он вам не нужен).

ocamlfind также можно использовать через ocamlbuild. До ocaml 3.12 вы добавили немного взломать файл myocamlbuild.ml (ссылка), но начиная с версии 3.12 это очень просто: используйте package(foo) в тегах ocamlbuild, если вы хотите использовать пакет ocamlfind foo, и добавьте параметр -use-ocamlfind к вызову ocamlbuild.

¹: ocamlfind — это язык общения пакетов OCaml. Если некоторые из ваших третьих библиотек не регистрируются через ocamlfind, вы должны отыскать их, написать META-файл (это несложно) и отправить его специалисту по сопровождению библиотеки.

person gasche    schedule 13.05.2011

Я думаю, что вы ищете $CAML_LD_LIBRARY_PATH, чтобы указать расположение дополнительных библиотек для ссылок, см. фр. http://www.cs.jhu.edu/~scott/pl/caml/htmlman/manual024.html

person Kenneth Hoste    schedule 19.08.2014

Вы должны иметь возможность установить переменную среды OCAMLLIB, чтобы получить результат, который вы ищете. Это задокументировано, чтобы помочь ocamlrun найти файл ld.conf, который вы указали в своем вопросе, но также может помочь вам с ocamlc. В базовом дистрибутиве OCaml нет файла конфигурации для путей к библиотекам, только файл конфигурации для поиска библиотек C.

person Thelema    schedule 21.06.2011