5

我的配置如下:

OCaml 由 Homebrew 根据其默认配方安装。它存在于/usr/local/Cellar/objective-caml/3.12.0/[bin,lib,share]其中,其内容被符号链接到/usr/local/[bin,lib,share].

第 3 方库 (LLVM) 将符号链接安装到/usr/local/lib/ocaml/*. 至关重要的是,/usr/local/lib/ocaml它本身不是Homebrew Cellar 的符号链接,而是包含指向 OCaml Cellar 路径下各个文件的链接的文件夹,因此这些 3rd 方库文件位于/usr/local/lib/ocaml/路径中,但不是原始路径

标准 OCaml 编译器/解释器/构建工具始终无法找到这些 3rd 方库,除非它们被明确指出(例如使用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 搜索路径?
  • 假设这是 Homebrewconfigure和安装过程的结果(即假设问题是 OCaml,按照配置,假设它的实际库路径是/usr/local/Cellar/objective-caml/3.12.0/lib/ocaml而不是/usr/local/lib/ocaml),是否可以--prefix在配置期间强制显式添加额外的搜索路径?
  • 安装后是否可以扩展整个环境的搜索路径(通过编辑配置文件,而不是不得不求助于潜在的重新安装)?
4

4 回答 4

6

确实正如 ygrek 指出的那样,答案是ocamlfind。OCamlfind 维护了一个安装在您系统上的支持 findlib 的 OCaml 包的列表,并且很容易链接它们。采用

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)如果您想使用 ocamlfind 的包,请在 ocamlbuild 标记中使用,并在调用中foo添加选项。-use-ocamlfindocamlbuild

¹:ocamlfind 是 OCaml 包的通用语言。如果您的一些第三个库没有通过 ocamlfind 注册自己,您应该搜索它们,编写一个 META 文件(这很容易),然后将其发送给库维护者。

于 2011-05-13T09:15:00.280 回答
5

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 这样的高级构建系统完全隐藏了所有这些东西,用户只需要提供依赖包的名称。

于 2011-05-13T06:50:54.280 回答
1

我认为您正在寻找 $CAML_LD_LIBRARY_PATH 来指定要链接到的其他库的位置,cfr。http://www.cs.jhu.edu/~scott/pl/caml/htmlman/manual024.html

于 2014-08-19T08:25:20.547 回答
0

您应该能够设置OCAMLLIB环境变量以获得您正在寻找的结果。这已记录在案以帮助ocamlrun找到ld.conf您在问题中记下的文件,但也可能对您有所帮助ocamlc。OCaml 的核心发行版没有库路径的配置文件,只有用于定位 C 库的配置文件。

于 2011-06-21T20:17:31.780 回答