我正在尝试使用ocamlbuild
而不是make
,但我无法将我的目标文件与外部.cma
库正确链接。似乎ocamlbuild
首先尝试确定依赖关系,然后忽略-L/path/to/lib.cma
之类的标记。使用make
我只是将带有-I
和-L
标记的所有必要目录传递给ocamlc
,但这些目录似乎不适用于ocamlbuild
- { {1}}因为无法找到必要的库而一直失败。
答案 0 :(得分:7)
您至少有两种方法可以将参数传递给ocamlbuild,以便将您的图书馆存入帐户:
您可以使用ocamlbuild的命令行参数:
$ ocamlbuild -cflags '-I /path/to/mylibrary' -lflags '-I /path/to/mylibrary mylibrary.cma' myprogram.byte
将.cma
替换为.cmxa
以获取原生可执行文件。
使用myocamlbuild.ml文件让ocamlbuild“知道”该库,并在_tag文件中标记需要它的文件:
在myocamlbuild.ml
:
open Ocamlbuild_plugin
open Command
dispatch begin function
| After_rules ->
ocaml_lib ~extern:true ~dir:"/path/to/mylibrary" "mylibrary"
| _ -> ()
在_tags
:
<glob pattern>: use_mylibrary
ocaml_lib
中的myocamlbuild.ml
指令告诉工具名为“mylibrary”的库(特定实现以.cma
或.cmxa
或其他结尾 - 分析,插件)位于“/ path / to / mylibrary”目录中。
项目目录中与glob pattern
对应的所有文件都将与ocamlbuild
使用“mylibrary”相关联,并使用ad hoc参数进行编译(因此您无需担心关于本机或字节目标)。
例如:
<src/somefile.ml>: use_mylibrary
注意:如果库位于编译器已知的路径中(通常为/usr/lib/ocaml
或/usr/local/lib/ocaml
),则路径前缀可以安全地替换为+
符号,因此/usr/lib/ocaml/mylibrary
变为+mylibrary
。