使用 3rd 方库编译

Compilation using 3rd party libraries

我正在使用 Getopt 来解析 commands.ml 中的命令行参数。所以 commands.ml 的第一行看起来像这样:

open Getopt

我似乎无法弄清楚如何使用此模块编译 commands.ml。我尝试了很多东西,但总是出现以下错误:

File "commands.ml", line 1, characters 5-11:
Error: Unbound module Getopt

我已将#require "Getopt" 添加到我的 .ocamlinit 文件中。

你说你正在使用 Getopt,“so” 你的代码中有 open Getopt。但那里没有直接联系。在不打开模块的情况下使用模块更常见(而且在我看来通常更好)。

open 的使用仅控制包含模块中可用的名称。它不会告诉编译器去哪里寻找打开的模块。

标准 OCaml 库中没有 Getopt 模块。解析命令行的标准模块名为Arg。如果您使用的是外部库,则需要使用 -I 标志来告诉编译器在哪里寻找它。

.ocamlinit 文件控制 OCaml 顶层(read-eval-print 解释器)的行为。它不会影响编译器的行为。

如果您使用的是构建工具,可能有更简单的设置方法。但是你需要更仔细地解释你的构建环境。

问题在于,您的问题有很多答案。根据您选择的构建系统,会有不同的命令。这就是为什么我们要问的原因。但是看起来,你没有偏好,所以让我试着给你一些答案。

ocamlbuild

$ ocamlbuild -package getopt commands.native

ocamlfind

$ ocamlfind ocamlopt -package getopt commands.ml -o commands.native

有关更多说明,请阅读 following

个人建议:如果您不确定选择什么,请使用 ocamlbuild

ocamlfind 与您喜欢的编译器一起使用(我在下面使用 ocamlopt),如下所示:

ocamlfind ocamlopt -package getopt -linkpkg commands.ml -o commands

如果您没有安装 getopt,这仍然会失败。 Getopt 可能与 opam 一起安装:

opam install getopt

我建议您改用 Arg。它是 OCaml 标准库的一部分,通常使用起来很愉快。