使用第三方库编译

时间:2015-06-19 16:45:03

标签: compilation ocaml

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

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

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

# The data
set.seed(144)
dat <- data.frame(V1=1:100,V2=rnorm(100)>0)
dat$V3 <- dat$V2 == 1
head(dat)
#   V1    V2    V3
# 1  1 FALSE FALSE
# 2  2  TRUE  TRUE
# 3  3 FALSE FALSE
# 4  4 FALSE FALSE
# 5  5 FALSE FALSE
# 6  6  TRUE  TRUE

# Convert all to numeric
cols <- sapply(dat, is.logical)
dat[,cols] <- lapply(dat[,cols], as.numeric)
head(dat)
#   V1 V2 V3
# 1  1  0  0
# 2  2  1  1
# 3  3  0  0
# 4  4  0  0
# 5  5  0  0
# 6  6  1  1

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

3 个答案:

答案 0 :(得分:3)

您说您正在使用Getopt,“所以”您的代码中有open Getopt。但那里没有直接联系。通常(并且在我看来通常更好)使用模块而不打开它们。

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

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

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

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

答案 1 :(得分:1)

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

使用ocamlbuild

$ ocamlbuild -package getopt commands.native

使用ocamlfind

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

有关详细说明,请阅读following

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

答案 2 :(得分:1)

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

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

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

opam install getopt

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