Почему сторонние библиотеки не найдены в пути поиска OCaml? - PullRequest
4 голосов
/ 13 мая 2011

Моя конфигурация следующая:

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, а является папкой, содержащей ссылки на отдельные файлы по пути к Cellar OCaml, поэтому эти файлы сторонних библиотек находятся по пути /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 в соответствии с настройкой, если предположить, что его фактический путь к lib равен /usr/local/Cellar/objective-caml/3.12.0/lib/ocaml, а не /usr/local/lib/ocaml), можно ли принудительно вызвать явно добавить дополнительные пути поиска вне --prefix во время настройки?
  • Можно ли расширить пути поиска для всей среды после установки (путем редактирования файлов конфигурации, вместо того, чтобы прибегать к возможной переустановке)?

Ответы [ 4 ]

5 голосов
/ 13 мая 2011

Действительно, как указал Игрек, ответ - 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 (это легко) и отправить его сопровождающему библиотеки.

4 голосов
/ 13 мая 2011

Единственный встроенный путь поиска для модулей 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, полностью скрывают все эти вещи, и пользователю нужно только указать имена зависимых пакетов.

1 голос
/ 19 августа 2014

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

0 голосов
/ 22 июня 2011

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

...