如何在 (Arch) Linux x86_64 上安装 OCaml 核心库?

How do I install the OCaml Core library on (Arch) Linux x86_64?

$ ocaml -version
The OCaml toplevel, version 4.02.1
$ opam --version
1.2.0
$ opam init 
$ opam install core

#=== ERROR while installing camlp4.4.02.1+system ==============================#
# opam-version 1.2.0
# os           linux
# command      sh ./check-camlp4.sh
# path         /home/john/.opam/system/build/camlp4.4.02.1+system
# compiler     system (4.02.1)
# exit-code    1
# env-file     /home/john/.opam/system/build/camlp4.4.02.1+system/camlp4-32324-f0f09f.env
# stdout-file  /home/john/.opam/system/build/camlp4.4.02.1+system/camlp4-32324-f0f09f.out
# stderr-file  /home/john/.opam/system/build/camlp4.4.02.1+system/camlp4-32324-f0f09f.err
### stdout ###
# ...[truncated]
# 4.02 by switching to a local installation via `opam switch 4.02.1`.
# 
# Here are some installation instructions for camlp4 if you obtained OCaml
# via the OPAM binary packages:
# 
# http://software.opensuse.org/download.html?project=home%3Aocaml&package=ocaml
# 
# * Debian/Ubuntu: sudo apt-get install camlp4-extra
# * RHEL/CentOS/Fedora: sudo yum install ocaml-camlp4
# 
### stderr ###
# ./check-camlp4.sh: line 3: camlp4orf: command not foun

我在 opam init 期间对自动完成脚本问题的回答是 。此外,错误的截断部分表明以下内容:

Please install a system-wide version of camlp4. This is necessary since you are using OCaml 4.02.1 and the system compiler switch (which uses your preexisting installation rather than compile one from scratch).

If you cannot install a system-wide camlp4, then you can still use OCaml 4.02 by switching to a local installation via opam switch 4.02.1

# pacman -S camlp4
$ opam install camlp4
$ opam info camlp4
            package: camlp4
            version: 4.02.1+system
         repository: default
           homepage: https://github.com/ocaml/camlp4
            license: LGPLv2
  installed-version: 4.02.1+system [system]

再一次...

$ opam install core

#=== ERROR while installing herelib.109.35.02 =================================#
# opam-version 1.2.0
# os           linux
# command      make
# path         /home/john/.opam/system/build/herelib.109.35.02
# compiler     system (4.02.1)
# exit-code    2
# env-file     /home/john/.opam/system/build/herelib.109.35.02/herelib-31366-c61e7b.env
# stdout-file  /home/john/.opam/system/build/herelib.109.35.02/herelib-31366-c61e7b.out
# stderr-file  /home/john/.opam/system/build/herelib.109.35.02/herelib-31366-c61e7b.err
### stdout ###
# ...[truncated]
# ocamlfind ocamlopt -shared -linkall lib/herelib.cmxa -o lib/herelib.cmxs
# ocamlfind ocamldep -syntax camlp4o -package camlp4.extend -package camlp4.quotations -package camlp4.lib -modules lib/pa_here.mli > lib/pa_here.mli.depends
# ocamlfind ocamlc -c -g -syntax camlp4o -package camlp4.extend -package camlp4.quotations -package camlp4.lib -I lib -o lib/pa_here.cmi lib/pa_here.mli
# + ocamlfind ocamlc -c -g -syntax camlp4o -package camlp4.extend -package camlp4.quotations -package camlp4.lib -I lib -o lib/pa_here.cmi lib/pa_here.mli
# File "lib/pa_here.mli", line 1:
# Error: The files /usr/lib/ocaml/pervasives.cmi
#        and /usr/lib/ocaml/camlp4/Camlp4.cmi make inconsistent assumptions
#        over interface Pervasives
# Command exited with code 2.
# Makefile:21: recipe for target 'build' failed
### stderr ###
# File "setup.ml", line 232, characters 8-26:
# Warning 3: deprecated: String.set
# Use Bytes.set instead.
# File "setup.ml", line 2385, characters 6-24:
# Warning 3: deprecated: Lazy.lazy_from_fun
# Use Lazy.from_fun instead.
# E: Failure("Command ''/usr/bin/ocamlbuild' lib/herelib.cma lib/herelib.cmxa lib/herelib.a lib/herelib.cmxs lib/pa_herelib.cma lib/pa_herelib.cmxa lib/pa_here
lib.a lib/pa_herelib.cmxs -use-ocamlfind -tag debug' terminated with error code 10")
# make: *** [build] Error 1

我需要切换到不同的编译器吗?

$ opam switch
system  C system  System compiler (4.02.1)
--     -- 3.11.2  Official 3.11.2 release
--     -- 3.12.1  Official 3.12.1 release
--     -- 4.00.0  Official 4.00.0 release
--     -- 4.00.1  Official 4.00.1 release
--     -- 4.01.0  Official 4.01.0 release
--     -- 4.02.0  Official 4.02.0 release
--     -- 4.02.1  Official 4.02.1 release

您应该从系统编译器切换到 OPAM 的编译器。然后将自动下载和编译编译器的源代码以及所有先决条件。为了切换,使用以下命令:

opam switch 4.02.1

您当然可以使用任何可用的编译器来代替 4.02.1

实际错误是出于某种原因(我认为是由于滚动发布模型)您有不同版本的 camlp4 和 OCaml 编译器,因此它们无法相互通信。