我正在尝试创建一个可以在其他OCaml项目中使用的库,而且我完全迷失了。
我目前正在使用ocamlbuild
,这非常适合吐出可执行文件,但我不知道如何从中获取库。
我在ocamlopt
和ocamlc
中发现了-a选项,但我不确定如何使用它。我发现的文档(例如here)似乎假设了一些先前存在的知识。我甚至都不知道.a文件是什么。运行之后,我需要构建一个依赖于此库的项目的输出文件?我是否需要mli文件以便应用程序知道库代码的签名,或者以某种方式包含在输出中?此外,能够将所有文件打包在一起会很好,类似于Java的.jar文件。
无论如何,我希望ocamlbuild
为我做所有这些,因为如果我必须调用ocamlopt -a
,我将不得不手动指定依赖关系或破解脚本{{1} 1}} - ocamldep
应该修复的东西。但是,我不知道如何告诉它建立一个图书馆。
如果有必要,我愿意使用绿洲或OPAM或其他东西,但我想首先使用基本工具学习如何做到这一点。
答案 0 :(得分:5)
OCamlbuild具有一些用于构建库的内置功能,因此您可以开始使用ocamlbuild foo.cma foo.cmxa
(假设foo.ml
是您的入口点)。这将为您调用ocamlopt -a
和ocamlc -a
,处理所有依赖项管道并将生成的文件保留在_build
内。
这应该足以让你编译一个库并从另一个程序链接它。由于这只是一个测试,因此在编译使用该库的程序时,您可以简单地指向前面提到的_build
和-I
。对于实际使用,应该打包一个库 - 当你到达那一点时,你会想要查看ocamlfind,绿洲等。
在编译OCaml项目时查看the ocaml.org tutorial。此外,bytecode和native code编译器的官方手册包含有关生成和使用各种类型文件的有用详细信息。
答案 1 :(得分:0)
documentation for ocamlbuild archives似乎涵盖了这一点。
无论如何,这是一种制作ocaml库的方法。假设您有一个名为foo
的目录,其中包含.ml
,.mli
和.mllib
文件。假设它包含bar.ml
,bar.mli
,baz.ml
和baz.mli
。要将所有内容分发为一个库,您在该目录中还将有一个foo.mllib
,其内容为
Bar
Baz
然后编译
$ ocamlbuild -use-ocamlfind foo.cma foo.cmxa
Here是一个示例。
然后使用您的库foo
,假设您有一个名为main
的兄弟目录,并且main
包含main.ml
,_tags
,{{1 }}。
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
使用{p>编译<main.{ml,native,byte}>: use_foo
main.ml
运行
$ ocamlbuild -use-ocamlfind main.byte main.native
此处还有更多信息:https://ocaml.org/learn/tutorials/ocamlbuild/Using_an_external_library.html