为什么在OCaml搜索路径上找不到第三方库?

时间:2011-05-12 22:26:36

标签: macos build ocaml llvm homebrew

我的配置如下:

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路径下各个文件的链接的文件夹,因此这些第三方库文件位于{{ 1}}路径但不是

的原始路径

标准的OCaml编译器/解释器/构建工具始终无法找到这些第三方库,除非明确指出这些库(例如/usr/local/lib/ocaml/)。

ocamlbuild -cflags -I,/usr/local/lib/ocaml列出:

ld.conf

这似乎表明编译器搜索路径设置正确,但我不熟悉工具链的内部工作原理。

  • 这是一个已知的问题吗?
  • 有没有办法打印标准工具实际使用的OCaml搜索路径?
  • 假设这是Homebrew /usr/local/lib/ocaml/stublibs /usr/local/lib/ocaml /usr/local/lib/ocaml/site-lib/pcre 和安装过程的结果(即假设问题是OCaml,如配置的那样,假设它的实际lib路径是configure而不是/usr/local/Cellar/objective-caml/3.12.0/lib/ocaml) ,是否可以在配置期间强制在/usr/local/lib/ocaml之外显式添加其他搜索路径?
  • 是否可以在安装后扩展整个环境的搜索路径(通过编辑配置文件,而不必采用可能的重新安装)?

4 个答案:

答案 0 :(得分:5)

正如ygrek指出的那样,答案是ocamlfind。 OCamlfind维护了系统上安装的findlib-enabled¹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文件(link),但是从3.12开始就很容易了:如果你想使用ocamlfind的包,请在ocamlbuild标签中使用package(foo) { {1}},并向foo的调用添加选项-use-ocamlfind

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

答案 1 :(得分:4)

ocaml模块的唯一内置搜索路径是stdlib的路径 - 请使用ocamlc -where查看。 ld.conf中引用的路径用于查找stublibs - 使用C绑定编译为动态可加载模块的C代码,用于字节码ocaml程序(没有自定义运行时)。无法通过ocaml安装在全局范围内“扩展”搜索路径。

正确的方法是在调用ocaml工具时添加所需的包含路径。 ocamlfind工具极大地有助于以独立于系统的方式执行此操作。 E.g:

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

像oasis / ocamlbuild / omake / etc这样的高级构建系统完全隐藏了所有这些东西,用户只需要提供依赖包的名称。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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