使用“ocamlfind”来创建OCaml编译器和顶层查找(项目特定的)库

时间:2010-01-07 19:48:56

标签: ocaml ocamlbuild ocamlfind

我正在尝试将 ocamlfind 与OCaml编译器和顶层一起使用。根据我的理解,我需要将所需的库放在项目根目录的_tags文件中,以便 ocamlfind 工具负责加载它们 - 允许我在我的模块中打开它们像这样:

open Sdl
open Sdlvideo
open Str

目前,我的_tags文件如下所示:

<*>: pkg_sdl,pkg_str

我显然可以使用ocamlc或ocamlopt参数启动 ocamlfind 命令,前提是我不想编译我的项目,但我没有看到以相同方式启动顶层的选项。有没有办法做到这一点(类似“ocamlfind ocaml”)?

我也不知道如何将我的项目特定模块放在_tags文件中:想象我有一个模块名称 Land 。我目前正在使用#use "land.ml"指令打开文件并加载模块,但有人建议这不是一个好习惯。我应该在_tags中使用什么语法来指定它应该由 ocamlfind 加载(考虑到land.ml不在ocamlfind搜索路径中)?

谢谢你, 查理P.

编辑:根据这篇文章的第一个答案,_tags文件不能与 ocamlfind 一起使用。上面的问题仍然存在,列表中只有一个新问题:将库指定为 ocamlfind 的正确方法是什么?

3 个答案:

答案 0 :(得分:4)

试试这个:

$ cat >> .ocamlinit
#use "topfind";;
#require "sdl";;
#require "sdlvideo";;

open Sdl
open Sdlvideo;;
open Str;;

.ocamlinit来自当前目录,后退回/home/user/.ocamlinit。您可以通过ocaml -init <filename>

明确覆盖它

答案 1 :(得分:4)

应该区分ocamlfind包,模块名称和文件名。源代码仅引​​用模块名称。模块由.cma .cmo .cmx(和.cmi)文件提供。 Ocamlfind包是这些文件的命名集合(从一些ocaml库源构建的二进制文件)。 Ocamlfind并不是构建项目所必需的 - 只需通过-I指定所有已使用库的路径。但是如果项目以源代码形式分发 - 另一个人将会遇到麻烦,因为使用过的库被放置在不同的地方。然后,人们寻求指定使用的“第三方代码片段”的名称的方法,以及一些将这些名称解析为实际路径的外部工具。这个工具是ocamlfind。

  • 首先找到提供所需模块的ocamlfind软件包(在本例中为Sdl和Sdlvideo - 只运行ocamlfind list,最有可能的软件包名为sdl
  • 使用ocamlfind ocamlc -package <package name> -linkpkg source.ml -o program
  • 进行编译
  • 或者使用ocamlfind提取包(ocamlfind query <package name>)提供的.cma文件(和其他)的路径,并将此路径与您的构建工具(普通Makefile,ocamlbuild等)一起使用。
  • 此外,ocamlfind(旨在)消除了记住实际的.cma文件如何命名以及需要哪些匹配的编译器选项以及包依赖于彼此的顺序的负担。只需要指定包名称。

请记住,库名称(纯粹以人为目标的名称,例如ocaml-extlib),模块名称(ExtLibEnum之间没有一对一的严格正式关系, IO等),文件名(extLib.cma)和ocamlfind包名(extlib),但为方便起见,包维护者和库作者通常选择可猜测的名称:)

答案 2 :(得分:3)

_tags文件不适用于ocamlfind,但适用于ocamlbuild。 例如: ocamlbuild land.native