使用;“ocamlfind”;使OCaml编译器和顶级查找(特定于项目的)库

使用;“ocamlfind”;使OCaml编译器和顶级查找(特定于项目的)库,ocaml,ocamlbuild,ocamlfind,Ocaml,Ocamlbuild,Ocamlfind,我正在尝试将ocamlfind与OCaml编译器和顶层一起使用。据我所知,我需要将所需的库放在项目根目录下的_标记文件中,以便ocamlfind工具能够加载它们-允许我在模块中打开它们,如下所示: open Sdl open Sdlvideo open Str 当前,my_标记文件如下所示: <*>: pkg_sdl,pkg_str :pkg_sdl,pkg_str 显然,我可以使用ocamlc或ocamlopt参数启动ocamlfind命令,前提是我不想编译我的项目,但我没有

我正在尝试将ocamlfind与OCaml编译器和顶层一起使用。据我所知,我需要将所需的库放在项目根目录下的_标记文件中,以便ocamlfind工具能够加载它们-允许我在模块中打开它们,如下所示:

open Sdl
open Sdlvideo
open Str
当前,my_标记文件如下所示:

<*>: pkg_sdl,pkg_str
:pkg_sdl,pkg_str
显然,我可以使用ocamlc或ocamlopt参数启动ocamlfind命令,前提是我不想编译我的项目,但我没有看到以相同方式启动顶级的选项。有没有办法做到这一点(比如“
ocamlfindocaml

我也不知道如何将特定于项目的模块放在_标记文件中:假设我有一个模块名Land。我目前正在使用
#use“land.ml”
指令打开文件并加载模块,但有人认为这不是一种好的做法。我应该在_标记中使用什么语法来指定它应该由ocamlfind加载(考虑到land.ml不在ocamlfind搜索路径中)

谢谢,, 查理P


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

标签文件不是用于ocamlfind,而是用于ocamlbuild。 例如: ocamlbuild land.native

试试这个:

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

open Sdl
open Sdlvideo;;
open Str;;

.ocamlinit
源于当前目录,返回到
/home/user/.ocamlinit
。您可以通过
ocaml-init

显式覆盖它。您应该区分ocamlfind包、模块名和文件名。源代码仅引用模块名称。模块由.cma.cmo.cmx(和.cmi)文件提供。Ocamlfind包是此类文件的命名集合(从某些ocaml库源构建的二进制文件)。Ocamlfind对于构建项目来说并不是绝对必要的——只需通过-I指定所有已使用库的路径即可。但如果项目以源代码形式分发,则其他人将难以构建它,因为已使用的库放置在不同的位置。然后,我们寻求一种方法来指定所使用的“第三方代码段”的名称,以及一些外部工具来将这些名称解析为实际路径。这个工具是ocamlfind

  • 首先找到提供所需模块的ocamlfind包(在本例中为Sdl和Sdlvideo-只需运行
    ocamlfind list
    ,该包很可能命名为
    Sdl
  • 使用
    ocamlfind ocamlc-package-linkpkg source.ml-o程序编译
  • 或者使用ocamlfind提取包提供的.cma文件(和其他文件)的路径(
    ocamlfind query
    ),并将此路径与构建工具(普通Makefile、ocamlbuild等)一起使用
  • 此外,ocamlfind(旨在)消除了记住实际.cma文件的命名方式、需要哪些匹配的编译器选项以及包之间相互依赖的顺序的负担。只需指定包名即可
请记住,库名称(纯人类目标名称,例如,
ocaml extlib
)、模块名称(
extlib
Enum
IO
等)、文件名(
extlib.cma
)和ocamlfind包名称(
extlib
)之间没有一对一的严格形式关系,但为了方便起见,包维护人员和库作者通常选择可猜测的名称:)

#使用“land.ml”不加载模块,而是加载文件的内容。