我是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来获取最终的可执行文件(不在顶层运行)。我知道这是一个非常基本的问题,但我无法解决它。提前谢谢。
答案 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
字段。