ocamlbuild和OUnit

时间:2014-02-23 00:19:19

标签: makefile ocaml ocamlbuild ounit

我的项目结构如下:

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.bytetests的{​​{1}}规则应该是什么样的?

2 个答案:

答案 0 :(得分:3)

由于OCaml程序没有默认的主函数(OCaml只是在启动时运行每个模块中的顶级代码),您可能希望有一个单独的文件来启动代码。 e.g。

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运行测试。

答案 1 :(得分:0)

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

(托马斯关于课程结构的建议当然还是独立的。)