我的项目结构如下:
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
的{{1}}规则应该是什么样的?
答案 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.byte
和tests.byte
构建为ocamlbuild的两个目标。运行myprog.byte
运行程序,tests.byte
运行测试。
答案 1 :(得分:0)
unbound value main
听起来不像是与main.byte
相关的错误,而是tests.ml
的OCaml代码中的真正错误。你能提供(可能是简化的)实验来源吗?
(托马斯关于课程结构的建议当然还是独立的。)