Makefile 在ocamlbuild中使用外部库

Makefile 在ocamlbuild中使用外部库,makefile,ocaml,ocamlbuild,Makefile,Ocaml,Ocamlbuild,我试图使用ocamlbuild而不是make,但无法将我的对象文件与外部.cma库正确链接。似乎ocamlbuild首先尝试确定依赖项,然后忽略像-L/path/to/lib.cma这样的标志。使用make时,我只是将带有-I和-L标志的所有必要目录传递给ocamlc,但是这些似乎不适用于ocamlbuild,ocamlc不断失败,因为它找不到必要的库。您至少有两种方法将参数传递给ocamlbuild,以便它考虑到您的库: 您可以使用ocamlbuild的命令行参数: $ ocamlbuild

我试图使用
ocamlbuild
而不是
make
,但无法将我的对象文件与外部
.cma
库正确链接。似乎
ocamlbuild
首先尝试确定依赖项,然后忽略像
-L/path/to/lib.cma这样的标志。使用
make
时,我只是将带有
-I
-L
标志的所有必要目录传递给
ocamlc
,但是这些似乎不适用于
ocamlbuild
ocamlc不断失败,因为它找不到必要的库。

您至少有两种方法将参数传递给ocamlbuild,以便它考虑到您的库:

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

    $ ocamlbuild -cflags '-I /path/to/mylibrary' -lflags '-I /path/to/mylibrary mylibrary.cma' myprogram.byte
    
    将本机可执行文件的
    .cma
    替换为
    .cmxa

  • 使用myocamlbuild.ml文件让ocamlbuild“了解”库,并在_标记文件中标记需要它的文件:

    build.ml
    中:

    open Ocamlbuild_plugin
    open Command
    
    dispatch begin function
      | After_rules ->
           ocaml_lib ~extern:true ~dir:"/path/to/mylibrary" "mylibrary"
      | _ -> ()
    
    \u标签中

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

    <src/somefile.ml>: use_mylibrary