4

我正在尝试将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的正确方法是什么?

4

3 回答 3

4

尝试这个:

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

open Sdl
open Sdlvideo;;
open Str;;

.ocamlinit来源于当前目录,回退到/home/user/.ocamlinit. 您可以通过显式覆盖它ocaml -init <filename>

于 2010-01-08T12:13:48.370 回答
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 query <package name>或者,使用 ocamlfind 提取包(
  • 此外,ocamlfind(旨在)消除记住实际 .cma 文件的命名方式以及需要哪些匹配的编译器选项以及软件包相互依赖的顺序的负担。只需要指定包名称。

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

于 2010-01-13T13:29:19.877 回答
3

_tags 文件不是用于 ocamlfind,而是用于 ocamlbuild。示例:ocamlbuild land.native

于 2010-01-07T19:54:31.243 回答