编译包含“打开 Findlib”的 Ocaml 文件时出现未绑定模块 Findlib 错误

Posted

技术标签:

【中文标题】编译包含“打开 Findlib”的 Ocaml 文件时出现未绑定模块 Findlib 错误【英文标题】:Unbound module Findlib error when I was compilering a Ocaml file which contains "open Findlib" 【发布时间】:2022-01-23 08:31:47 【问题描述】:

我写了一个Ocaml文件,它只包含一行代码:open Findlib,然后我保存文件并命名为test.ml。在Ocaml64(Ocaml for windows)环境中,我输入命令ocamlc -o test test.ml,有一个错误:Error:Unbound module Findlib。 但是如果我打开 ocaml 交互环境并这样做:

$ ocaml
        OCaml version 4.12.0
# #use "topfind"
  ;;
- : unit = ()
Findlib has been successfully loaded. Additional directives:
  #require "package";;      to load a package
  #list;;                   to list the available packages
  #camlp4o;;                to load camlp4 (standard syntax)
  #camlp4r;;                to load camlp4 (revised syntax)
  #predicates "p,q,...";;   to set these predicates
  Topfind.reset();;         to force that packages will be reloaded
  #thread;;                 to enable threads
# open Findlib;;
# 

它可以工作,所以我确定Findlib库存在,我不知道为什么当我编译包含open findlib的文件时会发生错误。

【问题讨论】:

【参考方案1】:

您需要将findlib 库链接到您的可执行文件。 ocamlfind 实用程序可以通过多种方式使用:

ocamlfind ocamlc -package findlib -o test test.ml

例如:

$ cat test.ml
open Findlib

let () = print_endline "hello"

$ ocamlfind ocamlc -package findlib -o test test.ml
$ ./test
hello
$

也可以使用ocamlfind查询库所在位置:

$ ocamlfind query findlib
/home/user/.opam/system/lib/findlib

然后告诉ocamlc 在链接您的程序时将该目录作为查找库的位置。

$ ocamlc -I /home/user/.opam/system/lib/findlib -o test test.ml
$ ./test
hello
$ ocamlc -I `ocamlfind query findlib` -o test test.ml
$ ./test
hello
$

【讨论】:

以上是关于编译包含“打开 Findlib”的 Ocaml 文件时出现未绑定模块 Findlib 错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥 OCaml 中的模块类型注释会导致此代码无法编译?

ocaml,能够在值更改时触发编译错误

OCaml 编译错误:语法错误:需要模块路径

为啥 OCaml 有时需要 eta 扩展?

在OCaml中忽略关于=的某些类型

如何可选地提供 OCaml (let*) 运算符以与新旧编译器一起使用?