6

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

4

1 回答 1

9

您至少有 2 种方法可以将参数传递给 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”的库(特定实现以.cmaor.cmxa或其他结尾 - 分析、插件)位于目录“/path/to/mylibrary”中。

    项目目录中对应的所有文件glob pattern都将与“mylibrary”的使用相关联ocamlbuild,并使用ad hoc参数进行编译(因此您无需担心本机或字节目标)。前任:

    <src/somefile.ml>: use_mylibrary
    

注意:如果库位于编译器已知的路径中(通常是/usr/lib/ocaml/usr/local/lib/ocaml),则路径前缀可以安全地替换为+符号,因此/usr/lib/ocaml/mylibrary变为+mylibrary.

于 2013-01-26T21:26:41.190 回答