2

私は最近、OCaml を動作させようとしてきましたが、インタプリタは問題なく動作します。ネイティブの実行可能ファイルをビルドすることはできません。これが私のプログラムです:

let () = print_endline "Hello, World!"

実行するocaml program.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.dependsが存在することがわかります。もう一度実行すると、次のようになります。

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.

だから存在するの!?!?!?! 内容はmy_prog.ml:. ちなみに、この_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 ファイルを取得しますが、機能せず、テキスト エディターで開くと、!<symlink>. 使用後は、存在しないreadlinkものを指します。_build/program.nativeこの時点で私は困惑しており、次にどこに行けばよいかわかりません。残念なことに、このプログラミング言語を機能させるのは非常に困難です。

OCamlをコンパイルするためだけにvmをデュアルブート/インストールする必要はありません。

最後に、OPAM のインストール方法を教えてください。

4

1 に答える 1

5

1) 空白文字 ('C:\Program Files...' など)、ASCII 以外の文字、または '~#?...' などの特殊文字を含むパスに OCaml をインストールしないでください。ビルド パスにもそのような文字を含めるべきではありません。一般的なビルド ツールはすべて cygwin (したがって unix 規則) に依存しているか、適切に引用するには愚かすぎるため、遅かれ早かれ問題が発生します。(また、ビルド パスが疑わしく見えます。「C:\Users\User」には、通常、プロジェクトに関係のない他の多くのファイルが含まれています。ファイルを専用のフォルダーに配置します。)

2) ネイティブ コードにコンパイルする場合は、C ツールチェーン (mingw-w64 または msvc) が $PATH に存在する必要があります。

3) cygwin および mingw-w64 コンパイラ用にカスタマイズした opam および OCaml ビルドを使用できます: https://github.com/fdopen/opam-repository-mingw。要件が満たされていれば、十分に機能します (必要なすべての cygwin パッケージがインストールされており、ユーザー名/ビルド パスに空白がなく、$PATH に代替の OCaml がインストールされていません)。

于 2016-02-05T13:46:43.417 に答える