我的配置如下:
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
这似乎表明编译器搜索路径设置正确,但我不熟悉工具链的内部工作原理。
/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
之外显式添加其他搜索路径?答案 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库的配置文件。