未绑定模块Png-Png.load

Cry*_*tal 0 ocaml

我目前正在尝试将png图片文件加载到中OCaml。我正在尝试使用该Png.load函数,但是当我使用它时OCaml出现错误:

未绑定的模块Png merlin。

我已经CamlImages下载了。我在用

  • OCaml版本4.08.1
  • camlimages版本5.0.1 ,我正在

  • macOS Catalina版本10.15.1

我非常感谢任何人提供的帮助或任何信息。数周以来,我一直在努力解决此问题。

ivg*_*ivg 5

要在OCaml中使用软件包,您必须执行两个操作:

  1. 安装软件包
  2. 告诉您的构建系统使用软件包

这是一个一般性准则,因为OCaml是一个成熟的系统,具有许多选项可供选择,因此有许多软件包管理器和许多构建系统,因此细节可能有所不同。我将从最普通的开始。

安装套件

欧帕

如果您使用的是OCaml软件包管理器(opam),则可以使用来安装软件包opam install <pkgname>,例如,

opam install camlimages
Run Code Online (Sandbox Code Playgroud)

不要忘记激活opam,

eval $(opam env)
Run Code Online (Sandbox Code Playgroud)

当opam在本地安装软件包时,您需要正确设置环境,以便构建系统可以看到它。这是eval $(opam env)在做什么。

带包装建造

与建立 ocamlbuild

OCamlBuild是古老的,但仍然退出了用于构建OCaml程序的流行工具。它非常易于使用,不会问太多问题。但是,它不适用于大型项目。如果您的应用程序主文件为app.ml,则build命令非常简单

ocamlbuild -pkg camlimages.all app.native
Run Code Online (Sandbox Code Playgroud)

该命令将自动扫描本地依赖关系并将其生成,并将您的应用程序与camlimages软件包链接。您可以使用-pkgs标志添加更多软件包,例如,

ocamlbuild -pkgs camlimages.all,core_kernel app.native
Run Code Online (Sandbox Code Playgroud)

由于OCamlBuild正在扫描您的文件夹中的文件,因此您应该为每个新文件夹创建一个新的新文件夹。OCamlBuild不喜欢您文件夹中的任何剩余或垃圾文件。它甚至可能抱怨它们并创建一个脚本来删除它们。

配置梅林

Merlin是自己的构建系统,因此也需要一些设置。最简单的方法是.merlin在项目的顶部文件夹中创建一个文件,然后为要使用的每个包添加一行PKG <pkgname>,例如,

 PKG camlimages.all
Run Code Online (Sandbox Code Playgroud)

软件包与库

在OCaml中,程序包是库的集合。通常,构成软件包的库的名称可能与软件包的名称不同。这通常会引起很多混乱。对于camlimages,我们有一个包含camlimages很多库的软件包,例如

$ ocamlfind list | grep camlimages
camlimages          (version: 4.2.6)
camlimages.all      (version: 4.2.6)
camlimages.all_formats (version: 4.2.6)
camlimages.core     (version: 5.0.1)
camlimages.exif     (version: 5.0.1)
camlimages.freetype (version: 5.0.1)
camlimages.gif      (version: 5.0.1)
camlimages.graphics (version: 5.0.1)
camlimages.jpeg     (version: 5.0.1)
camlimages.png      (version: 5.0.1)
camlimages.tiff     (version: 5.0.1)
camlimages.xpm      (version: 5.0.1)
Run Code Online (Sandbox Code Playgroud)

要弄清楚这些子库之间的依赖关系,您可以阅读描述软件包的META文件,该文件可读性强,可以通过以下命令轻松找到

less $(ocamlfind query camlimages)/META
Run Code Online (Sandbox Code Playgroud)

我建议您使用,camlimages.all但是如果它抱怨您可以选择适合您的设置的子集。