Bizare错误和I';我无法在Windows上构建OCaml程序

Bizare错误和I';我无法在Windows上构建OCaml程序,windows,compilation,compiler-errors,ocaml,ocamlbuild,Windows,Compilation,Compiler Errors,Ocaml,Ocamlbuild,我最近一直在尝试让OCaml工作,而解释器工作得很好,我就是无法用它构建本机可执行文件。这是我的节目: let () = print_endline "Hello, World!" 现在,如果我运行ocaml程序.ml我将获得Hello,World!的预期输出。但是,如果我运行ocamlbuild program.native我会得到: mkdir 'C:\Users\User\_build' '''C:\Program Files\OCaml\bin/ocamldep.opt' -modul

我最近一直在尝试让OCaml工作,而解释器工作得很好,我就是无法用它构建本机可执行文件。这是我的节目:

let () = print_endline "Hello, World!"
现在,如果我运行
ocaml程序.ml
我将获得
Hello,World!的预期输出。但是,如果我运行
ocamlbuild program.native
我会得到:

mkdir 'C:\Users\User\_build'
'''C:\Program Files\OCaml\bin/ocamldep.opt' -modules program.ml > program.ml.depends
Exception Sys_error("program.ml.depends: No such file or directory").
然而,如果我查看目录
C:\Users\User\
,我可以看到
program.ml.dependens
存在。再次运行时,我得到:

SANITIZE: a total of 1 file that should probably not be in your source tree
  has been found. A script shell file "C:\\Users\\User\\_build/sanitize.sh"
  is being created. Check this script and run it to remove unwanted files or
  use other options (such as defining hygiene exceptions or using the
  -no-hygiene option).
IMPORTANT: I cannot work with leftover compiled files.
ERROR: Leftover dependency files:
  File program.ml.depends in . has suffix .ml.depends
Exiting due to hygiene violations.
所以它确实存在!?!?!?!内容是
myu prog.ml:
。旁注,
\u build
目录包含以下文件:_digests、_log、program.ml和sanatize.sh。下面是使用-verbose 10运行命令时的输出:

mkdir 'C:\Users\User\_build'
Doing sanity checks
include directories are: [ "." ]
==> program.native
====> program.cmx
======> program.mlpack
======> program.ml
program.ml exists in source dir -> import it
======> program.ml.depends
========> program.ml
program.ml already built
start rule ocaml dependencies ml (%=program )
dyndeps: {.  .}
mid rule ocaml dependencies ml (%=program ): cache miss: a product is not in build dir (program.ml.depends)
'''C:\Program Files\OCaml\bin/ocamldep.opt' -modules program.ml > program.ml.depends
resource_changed: program.ml.depends
end rule ocaml dependencies ml (%=program )
======> program.cmi
========> program.mli
==========> program.mly
========> program.mlpack
program.mlpack already failed
========> program.ml
program.ml already built
========> program.ml.depends
program.ml.depends already built
start rule ocaml: ml -> cmo & cmi (%=program )
Exception Sys_error("program.ml.depends: No such file or directory").
如果我强迫它:

include directories are: [ "." ]
==> program.native
====> program.cmx
======> program.mlpack
======> program.ml
program.ml exists and up to date
======> program.ml.depends
program.ml.depends exists in source dir -> import it
======> program.cmi
========> program.mli
==========> program.mly
========> program.mlpack
program.mlpack already failed
========> program.ml
program.ml already built
========> program.ml.depends
program.ml.depends already built
start rule ocaml: ml -> cmo & cmi (%=program )
dyndeps: {.  .}
mid rule ocaml: ml -> cmo & cmi (%=program ): cache miss: a product is not in build dir (program.cmo)
'''C:\Program Files\OCaml\bin/ocamlc.opt' -c -o program.cmo program.ml
resource_changed: program.cmo
resource_changed: program.cmi
end rule ocaml: ml -> cmo & cmi (%=program )
start rule ocaml: ml & cmi -> cmx & o (%=program )
dyndeps: {.  .}
mid rule ocaml: ml & cmi -> cmx & o (%=program ): cache miss: a product is not in build dir (program.cmx)
'''C:\Program Files\OCaml\bin/ocamlopt.opt' -c -o program.cmx program.ml
resource_changed: program.cmx
resource_changed: program.o
end rule ocaml: ml & cmi -> cmx & o (%=program )
====> program.o
program.o already built
start rule ocaml: cmx* & o* -> native (%=program )
prepare_libs: "program.native" -> [  ]
caml_transitive_closure ~caml_obj_ext:"cmx" ~pack_mode:false
  ~used_libraries:[  ] [ "program.cmx" ]
packages: {.  .}
dependency_map: {::}
used_files: {. program.cmx .}
open_packages: [  ]
lib_index: {::}
dependencies: {::}
caml_transitive_closure: [ "program.cmx" ] -> [  ]
Failure: Link list cannot be empty.
我再次运行相同的命令:

include directories are: [ "." ]
==> program.native
====> program.cmx
program.cmx exists in source dir -> import it
====> program.o
program.o exists in source dir -> import it
start rule ocaml: cmx* & o* -> native (%=program )
prepare_libs: "program.native" -> [  ]
caml_transitive_closure ~caml_obj_ext:"cmx" ~pack_mode:false
  ~used_libraries:[  ] [ "program.cmx" ]
packages: {.  .}
dependency_map: {::}
used_files: {. program.cmx .}
open_packages: [  ]
lib_index: {::}
dependencies: {::}
caml_transitive_closure: [ "program.cmx" ] -> [ "program.cmx" ]
link: [ "program.cmx" ] -o program.native
dyndeps: {.  .}
mid rule ocaml: cmx* & o* -> native (%=program ): cache miss: a product is not in build dir (program.native)
'''C:\Program Files\OCaml\bin/ocamlopt.opt' program.cmx -o program.native
resource_changed: program.native
end rule ocaml: cmx* & o* -> native (%=program )
在这一点上,我得到了一个program.native文件,但是它不工作,当我在文本编辑器中打开它时,它以
开始。使用
readlink
后,它指向不存在的
\u build/program.native
。在这一点上,我被难住了,不知道下一步该去哪里。很遗憾,让这种编程语言工作起来如此困难

我不希望为了编译OCaml而必须双重启动/安装vm

最后一件事,如何安装OPAM?

1)不要将OCaml安装到包含空格字符(如“C:\Program Files…”)、非ascii字符或其他特殊字符(如“~#?…”)的路径。构建路径也不应包含此类字符。这迟早会导致问题,因为所有常见的构建工具要么依赖于cygwin(因此也依赖于unix约定),要么太愚蠢而无法正确引用。(此外,生成路径看起来可疑。“C:\Users\User”通常包含许多与项目无关的其他文件。请将文件放在专用文件夹中。)

2) 如果要编译为本机代码,则$PATH中必须存在C工具链(mingw-w64或msvc)


3) 您可以使用我为cygwin和mingw-w64编译器定制的opam和OCaml版本:。如果满足了要求(安装了所有必需的cygwin包,用户名/构建路径中没有空格,$PATH中没有其他OCaml安装),那么它就足够好了。

作为旁注,请尝试查看OcpWin: