如何使用 opam 安装特定版本的 ocaml 编译器

2024-04-28

如何使用 opam(或其他包管理器)安装特定版本的 ocaml 编译器(和兼容包)?

我快速浏览了 opam 文档,但没有找到相关信息。

我需要 ocaml 编译器(最好是本机代码编译器)来构建 unison,一个文件同步软件。我需要使用相同版本的 ocaml 在两台机器上构建一致,否则一致会发出错误并中止其职责(yiiii!)。

我尝试从 tar 球构建 ocaml 版本 4.04.0,然后使用它来构建一致,但在其中一台机器上,一致的构建失败并显示错误消息,

make[1]: Entering directory '/home/norio/Downloads/unison/unison-2.48.4_expand/src'
ocamlc -o mkProjectInfo unix.cma str.cma mkProjectInfo.ml
File "mkProjectInfo.ml", line 1:
Error: Error while linking /home/norio/Downloads/unison/ocaml_for_unison/lib/ocaml/unix.cma(Unix):
The external function `unix_has_symlink' is not available
if [ -f `which etags` ]; then \
    etags *.mli */*.mli *.ml */*.ml */*.m *.c */*.c *.txt \
          ; fi 
make[1]: Leaving directory '/home/norio/Downloads/unison/unison-2.48.4_expand/src'

我不想出发去寻找unix_has_symlink函数并致力于探索库依赖关系的沼泽,在文明到来和包管理器发明之前,许多开发人员已经陷入其中。

有没有类似的东西,opam install ocamlc-4.04 and opam install all-packages?


Addendum

错误信息是关于unix_has_symlink在运行 Linux Mint 18 Cinnamon 64 位的机器上观察到。这个函数是一些unix/linux库的一部分,而不是ocaml包的一部分吗?


要使用特定版本的编译器创建开关,请执行以下操作

opam switch create <compiler-version>

(注:对于旧的 opam 1.x 来说,它是opam switch <compiler-version>)

E.g.,

opam switch create 4.07.0

或者,如果您想创建一个全新的开关,它使用与其他开关相同的编译器,那么语法是

opam switch create <name> <compiler-version>

E.g.,

opam switch create myproj 4.07.0

请注意,如果<name>是一个文件夹,那么将创建一个本地交换机,例如,opam switch ./myproj 4.07.0将直接在中创建一个开关myproj folder.

要从特定版本开始,即当您第一次安装 opam 时,只需执行以下操作

opam init --compiler=<version>

E.g.,

opam init --compiler=4.07.0

要列出可用版本,请执行以下操作

opam switch 

要查看更多内容,请执行以下操作

opam switch list-available

要安装一个variant编译器,例如具有 flambda 或 spacetime 的编译器,使用以下通用语法,

opam switch create <switch-name> ocaml-variants.<version>+options <options>...

E.g.,

opam switch create myswitch ocaml-variants.4.13.0+options ocaml-option-flambda

use opam search ocaml-options查看可用选项的完整列表。可以指定多个选项,例如,

opam switch create myswitch ocaml-variants.4.13.0+options ocaml-option-flambda ocaml-option-spacetime ocaml-option-static
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 opam 安装特定版本的 ocaml 编译器 的相关文章

  • 让menhir将用户定义的函数从.mly添加到.mli

    Menhir 允许将任意 ocaml 代码添加到 mly 文件的末尾 我想在其中声明一些函数 但我找不到一种方法让 menhir 将我的函数添加到 mli 文件中 以便它们从其他模块中可见 是否可以 答案很简单 那就是no 中定义的代码 m
  • 跟踪编译器中 AST 节点的源位置 (ocaml)

    我正在使用 ocamllex yacc 在 ocaml 中编写编译器 一切进展顺利 但我遇到了设计问题 对于我创建的每个 AST 节点 最好能获得有关源代码中该节点的行 字符位置的信息 这对于稍后向用户提供错误消息很有用 现在 我可以向我的
  • 使用第一类模块时,类型构造函数“...”将转义其范围

    给定一个简单的工厂 module type Factory sig type t val create unit gt t end module FactoryImpl Factory struct type t string let cr
  • 扁平列表和免费 monad

    我试图说服自己 List monad 具有平面列表 列表串联和按元素映射的列表 不是一个自由 monad 准确地说 是与某个函子 T 关联的自由 monad 据我了解 我应该能够通过以下方式实现这一目标 首先在 monad 列表中找到常用运
  • 在 OCaml 中编写 main 脚本?

    如何在 OCaml 中模拟这个 Python 习惯用法 if name main main See 罗塞塔代码 http rosettacode org wiki ScriptedMain Python其他编程语言的示例 Ocaml 中没有
  • MonadFix 用严格的语言

    我正在为 Ocaml 中类似 haskell 的 do 表示法开发 camlp4 扩展 并试图弄清楚 GHC 如何编译递归 do 绑定 使用 XDoRec 启用 我想知道一元定点组合器是否可能以严格的语言存在 如 Ocaml F SML 如
  • 如何让 Bower 构建包?

    有没有办法让 Bower 在从 GitHub 克隆后运行包 grunt 我正在尝试使用 Bower 但我使用的软件包之一是 Bootstrap 扩展 x editable 问题是 虽然其他软件包将完整构建的版本推送到 github 所以当
  • OCaml 的并行化能力状况如何?

    我对在项目中使用 OCaml 很感兴趣 但是我不确定它的并行化功能在哪里 OCaml中有消息传递能力吗 OCaml 是否能够有效地使用 1 个以上的 CPU 我读到的关于这个主题的大部分内容都是在 2002 年至 2006 年写的 我没有看
  • 使用 Opam 管理项目依赖关系

    我是 OCaml 的新手 我使用过的其他语言 例如 Scala Clojure Node js 上的 Javascript 都有包管理器 允许人们以干净的状态启动项目 该项目具有一组已声明的已知版本的依赖项 我正在尝试与 Opam 做类似的
  • GODI-电池:安装问题

    我正在尝试使用 GODI 控制台安装 godi batteries 我似乎已经对所有依赖项进行了排序 例如甘菊 我在 Godi 的界面中收到以下错误 gt ocamlfind ocamlopt shared linkall package
  • OCaml 数据类型定义中的方括号“[”和“]”是什么意思?

    I saw 下列 https coq github io doc v8 11 api coq Genarg index html type rlevel type rlevel rlevel 但我以前从未见过这种情况 并且 ADT 代数数据
  • 具有可变参数数量的 OCaml 函数

    我正在探索 OCaml 函数的 高级 用法 我想知道如何编写具有可变数量参数的函数 例如 像这样的函数 let sum x1 x2 x3 xn x1 x2 x3 xn 通过一些类型黑客 当然 let sum f f 0 let arg x
  • 使用 OCaml 收集外部命令的输出

    在 OCaml 中调用外部命令并收集其输出的正确方法是什么 在Python中 我可以做这样的事情 os popen cmd read 如何在 OCaml 中获取外部程序的所有输出 或者 更好的是 带有 Lwt 的 OCaml Thanks
  • 使用只有一个元组值的变体类型构造函数

    type foo Foo of int int let t 1 2 Foo t Error The constructor Foo expects 2 argument s but is applied here to 1 argument
  • OCaml:如何运行包含库的脚本

    我正在按照 Real World OCaml 一书来学习 OCaml 许多程序都需要使用 Jane Street Core 库 当我在顶层使用这个核心库中的函数时 它工作得很好 在那里 我只需使用以下命令来打开 Core 库 use top
  • OCaml:为什么重命名类型会失败并显示“它们的种类不同”

    我正在为成对的类型见证和见证类型的值构建一个通用容器 我想将其用于几种不同的类型 这会给我带来错误 因为这些类型的名称都相同 所以我尝试重命名函子结果中的类型 如下所示 module type Witness sig type a key
  • 有人可以解释一下这个 OCaml 程序中使用的类型语法吗?

    以下类型取自这个问题 https stackoverflow com q 50586942 633183 contains an error later fixed by the OP type task Success a gt a ta
  • 在 OCaml 自定义顶层设置提示

    在 OCaml 自定义顶层中 有没有一种方法可以通过编程方式设置提示 到别的东西 我希望能够更改它以响应用户的最后一个自定义功能 有点像bash你如何设置PS1 我什至找不到 directive 来更改它 谢谢 在 toplevel top
  • OCaml 中的用户定义打印机

    printf fprintf等 全部接受 a转换 手册上说对于 a 用户定义的打印机 采用两个参数 并将第一个参数应用于 outchan 当前输出通道 和第二个参数 因此 第一个参数的类型必须为 out channel gt b gt un
  • OCaml 文字负数?

    我在学 这是我觉得奇怪的事情 let test treeways x match x with when x lt 0 gt 1 when x gt 0 gt 1 gt 0 如果我这样称呼它 test threeways 10 我会得到类型

随机推荐