1

我有一个结构如下的项目:

Makefile
src/
  main.ml
tests/
  tests.ml

Makefile这样的:

tests:
    ocamlbuild -Is src,tests tests.byte -build-dir $(BUILDDIR) $(TESTFLAGS) -lflags -I,/usr/lib/ocaml/oUnit -cflags -I,/usr/lib/ocaml/oUnit -libs oUnit

运行make tests(构建后main.byte)返回此错误:

ocamlbuild -Is src,tests tests.byte -build-dir build -lflags -I,/usr/lib/ocaml/oUnit -cflags -I,/usr/lib/ocaml/oUnit -libs oUnit 
+ /usr/bin/ocamlc -c -I /usr/lib/ocaml/oUnit -I tests -I src -o tests/tests.cmo tests/tests.ml
File "tests/tests.ml", line 3, characters 46-50:
Error: Unbound value main
Command exited with code 2.
Compilation unsuccessful after building 2 targets (0 cached) in 00:00:00.
make: *** [tests] Error 10

显示ocamlbuild无法链接到main.byte. tests外观的规则应该是Makefile怎样的?

4

2 回答 2

3

由于 OCaml 程序没有默认的 main 函数(OCaml 只是在启动时运行每个模块中的顶级代码),您可能需要一个单独的文件来启动代码。例如

main.ml
myprog.ml
tests.ml

在哪里:

  • main.ml定义一个主函数let main args = ...
  • myprog.ml只是调用它:let () = Main.main Sys.argv
  • tests.ml从每个测试用例中以相同的方式调用它

然后构建myprog.bytetests.byte作为您的两个目标到 ocamlbuild。运行myprog.byte以运行程序并tests.byte运行测试。

于 2014-02-23T18:57:38.920 回答
0

unbound value main听起来不像是相关的错误main.byte,而是 OCaml 代码中的真正错误tests.ml。你能提供(可能是简化的)实验来源吗?

(当然,Thomas 关于程序结构的建议仍然独立存在。)

于 2014-03-01T10:43:37.860 回答