使用带有ocamlbuild的外部库

时间:2013-01-26 18:04:49

标签: makefile ocaml ocamlbuild

我正在尝试使用ocamlbuild而不是make,但我无法将我的目标文件与外部.cma库正确链接。似乎ocamlbuild首先尝试确定依赖关系,然后忽略-L/path/to/lib.cma之类的标记。使用make我只是将带有-I-L标记的所有必要目录传递给ocamlc,但这些目录似乎不适用于ocamlbuild - { {1}}因为无法找到必要的库而一直失败。

1 个答案:

答案 0 :(得分:7)

您至少有两种方法可以将参数传递给ocamlbuild,以便将您的图书馆存入帐户:

  1. 您可以使用ocamlbuild的命令行参数:

    $ ocamlbuild -cflags '-I /path/to/mylibrary' -lflags '-I /path/to/mylibrary mylibrary.cma' myprogram.byte
    

    .cma替换为.cmxa以获取原生可执行文件。

  2. 使用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
    
  3. 注意:如果库位于编译器已知的路径中(通常为/usr/lib/ocaml/usr/local/lib/ocaml),则路径前缀可以安全地替换为+符号,因此/usr/lib/ocaml/mylibrary变为+mylibrary