【问题标题】:OCaml - Compiling multiple files into one executableOCaml - 将多个文件编译成一个可执行文件
【发布时间】:2015-05-26 18:11:31
【问题描述】:

我在 OCaml 中编写了一个数独求解器,我想为它创建一个可执行文件。

我有 3 个文件:board.ml、solver.ml 和 main.ml

board.ml 包含板的类型、读取文件的函数、检查有效性,...

solver.ml 包含解决给定数独的函数。 solver.ml 使用 board.ml 中的函数

main.ml 是一个程序,它使用 board.ml 和 solver.ml 中的函数来解决命令行参数提供的数独。

我不使用 .mli 文件,因为签名是在 .ml 文件中定义的,例如:

module Board :
    sig
        (* signature *)
    end
=
    struct
        (* implementations *)
    end

我已经能够使用 board.ml 中的所有代码来执行此操作,例如:

ocamlc board.mli board.ml main.ml -o sudoku_solver

最终结果应该是一个名为“sudoku_solver”的可执行文件,所以我可以这样做:

./sudoku_solver "sudoku.txt"

【问题讨论】:

  • 你有什么问题?
  • 我似乎无法使用 ocamloptocamlc 将这 3 个文件编译为单个可执行文件。 ivg 告诉我使用 ocamlbuild main.native 并且这有效,但它需要我在 Solver 和 main 中将 Board.t 更改为 Board.Board.t 以便我的代码不再在顶层工作。

标签: compilation ocaml


【解决方案1】:

只需使用:

ocamlbuild main.native

并运行它

./main.native "sudoku.txt"

【讨论】:

  • 如果我尝试这样做,我会收到错误消息:“文件“solver.mli”,第 3 行,字符 14-21:错误:未绑定类型构造函数 Board.t”。我的 .mli 仅使求解功能可用,如下所示: val solve : Board.t -> Board.t
  • 这不是编译的问题。 OCaml 将您的定义放入与您的文件同名的隐式模块中。这意味着,Board.t 的正确名称是 Board.Board.t
  • 谢谢!我已经更改了我的代码,现在它可以工作了!但这真的很令人困惑,因为这意味着我的代码不再在顶层工作了。
  • 这取决于你如何将它呈现给你的顶层,如果你正在使用它,用#mod_use替换#use可能会解决你的问题。
  • #use#mod_use 给出相同的错误:“错误:引用未定义的全局 'Board'”所以我必须再次将 Board.Board.t 替换为 Board.t 以使其在顶层。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多