在ocaml中链接模块时出错

时间:2013-04-12 12:53:31

标签: string module include ocaml

我是Ocaml编程的完全初学者,我无法将模块链接到我的程序中。实际上我正在做一些正则表达式检查,我编写了一个函数,它基本上使用Str module基于分隔符字符串来标记字符串。所以我使用库中定义的函数,如下所示:

Str.regexp_string /*and so on*/

然而,当我尝试编译ml文件时,我收到一个错误,表明我有一个未定义的全局 Str 。我们通过输入List.length来使用 List 函数,就像我为Str做的那样,而不必明确包含特定的模块。我试过了

open Str;;
include Str;; /*None of these work and I still get the same error*/

但是如果在顶层我使用

load "str.cma" /*Then the program works without problems*/

我想将模块包含在ml文件中,因为我必须在最后链接3 cmo来获取最终的可执行文件(不在顶层运行)。我知道这是一个非常基本的问题,但我无法解决它。提前谢谢。

4 个答案:

答案 0 :(得分:11)

您无需在文件foo.ml中添加任何内容。 在编译foo.ml时,你需要告诉编译器在哪里找到Str模块。为此,请将其添加到用于编译foo.ml的命令行:

ocamlc str.cma foo.ml

ocamlopt str.cmxa foo.ml
默认情况下,可以访问标准库中的

List和其他模块,因此您无需告诉编译器有关常用模块的信息。

答案 1 :(得分:0)

我认为你需要使用'-cclib'编译器指令。 模块名称不应包含以.cma结尾的文件。 下面是我在尝试使用unix和threads模块时所做的。 我认为您需要使用'custom'和'cclib'编译器指令的某种组合。

ocamlc -custom unix.cma threa.ml -cclib -lunix

查看本书第7章的帮助: http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora063.html

在这里查看编译器指令的覆盖范围: http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual022.html#c:camlc

答案 2 :(得分:0)

ocamlc calc.ml str.cma -o calc
File "calc.ml", line 1:
Error: Error while linking calc.cmo:
Reference to undefined global `Str'

代码非常简单,可以减少颈背。

let split_into_words s = 
    Str.split ( Str.regexp "[ \n\t]+") s ;;

let _ = 
    split_into_words "abc def ghi" ;;

在ocaml 4.0.2上。显然,这里存在一个问题,但我太初衷了解它是什么。从顶层来看,使用#load“str.cma”似乎工作得很好,所以这里有一些我们无法理解的东西。有谁知道它是什么?

答案 3 :(得分:0)

只需将 str 添加到您的 libraries 文件的 dune 字段。