11

我正在尝试创建一个可以在其他 OCaml 项目中使用的库,但我完全迷失了。

我目前正在使用ocamlbuild它非常适合吐出可执行文件,但我不知道如何从中获取库。

我发现了 -a 选项ocamloptocamlc但我不确定如何使用它。我找到的文档(例如,here)似乎假设了一些预先存在的知识。我什至不知道 .a 文件是什么。在我运行之后,我需要哪些输出文件来构建一个依赖于这个库的项目?我是否需要 mli 文件以便应用程序知道库代码的签名,或者以某种方式包含在输出中?此外,能够将所有文件打包在一起会很好,类似于 Java 的 .jar 文件。

在任何情况下,我都愿意为ocamlbuild我做这一切,因为如果我必须调用,ocamlopt -a我将不得不手动指定依赖项或修改脚本ocamldep——这ocamlbuild是应该修复的。但是,我不知道如何告诉它建立一个库。

如果有必要,我愿意使用 oasis 或 OPAM 或其他东西,但我想先学习如何仅使用基本工具来做到这一点。

4

2 回答 2

4

OCamlbuild 具有一些用于构建库的内置功能,因此您可以开始使用ocamlbuild foo.cma foo.cmxa(假设foo.ml是您的入口点)。这将调用ocamlopt -aocamlc -a为您处理所有依赖关系管道并将生成的文件留在_build.

这应该足以让您编译一个库并从另一个程序链接它。由于这只是一个测试,您可以在编译使用该库的程序时_build简单地指出上述内容。-I对于实际使用,应该打包一个库——当你到达那个点时,你会想要研究 ocamlfind、oasis 等。

查看关于编译 OCaml 项目的 ocaml.org 教程。此外,字节码本机代码编译器的官方手册包含有关生成和使用各种类型文件的有用详细信息。

于 2014-05-26T07:57:31.833 回答
0

ocamlbuild 档案的文档似乎很好地涵盖了这一点。

无论如何,这是做 ocaml 库的一种方法。假设您有一个名为的目录,foo其中包含您的.ml.mli.mllib文件。假设它包含bar.mlbar.mlibaz.mlbaz.mli。要将所有这些作为一个库分发,您还应该foo.mllib在该目录中有一个,其内容是

Bar
Baz

然后编译,做

$ ocamlbuild -use-ocamlfind foo.cma foo.cmxa

是一个例子。

然后要使用您的库foo,假设您有一个名为main,的同级目录,main其中包含main.ml, _tags, myocamlbuild.ml

myocamlbuild.ml应该有以下内容:

open Ocamlbuild_plugin
open Command

let () =
   dispatch (
      function
      | After_rules ->
         ocaml_lib 
            ~extern:true 
            ~dir:"/path/to/foo/_build" 
            "foo"
      | _ -> ()
   )

_tags应该有以下内容:

<main.{ml,native,byte}>: use_foo

编译main.ml_

$ ocamlbuild -use-ocamlfind main.byte main.native

运行

$ ./main.byte
$ ./main.native

更多信息也在这里:https ://ocaml.org/learn/tutorials/ocamlbuild/Using_an_external_library.html

于 2020-02-04T14:58:03.863 回答