Ale*_*lex 3 linux ocaml ffi opam
我在OCaml FFI上学习了本教程并Ctypes通过OPAM 安装:
opam install ctypes
Run Code Online (Sandbox Code Playgroud)
但是,OCaml找不到该模块:
open Ctypes
(* ... *)
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Unbound module Ctypes
Run Code Online (Sandbox Code Playgroud)
看起来我需要让OCaml知道我的Ctypes安装位置在哪里?我是否需要更新一些路径变量以让OCaml查找通过OPAM安装的库?
这是Ubuntu 15.04,OCaml 4.01.0,OPAM 1.2.0.
在系统上安装一些东西并不会使编译器自动显示,这不仅适用于OCaml,而且适用于大多数传统系统,例如C或C++等.
这意味着您需要将一些标志传递给编译器,或者编写Makefile,或者使用一些项目管理系统.
在OCaml中,我们拥有相当成熟的基础设施,特别适合opam.我不想深入解释,只是快速概述.
ocamlfind工具用于在系统上查找库.它pkg-config在想法上有点接近,但在设计上却截然不同.它包装了编译器工具,以便将选项传递给它们.
ocamlbuild是一个华丽的瑞士刀,是每个OCamler的武器库必备的.它是一种了解所有其他工具的工具,以及如何将它们粘合在一起.我会说这是编译项目的首选方式,尤其是小项目.
oasisautotools在精神上是接近的,但不是那种通用的并且是在前提下写的,它应该非常容易使用.事实上它很容易,但仍然非常灵活和强大.
记住这一概述,我们可以直接解决您的问题.所以你已经安装了ctypes.现在让我们ctypes从ocamlfind视角看一下如何在系统中看到包.最简单的方法是列出所有包,可见ocamlfind并找到ctypes:
$ ocamlfind list | grep ctypes
ctypes (version: 0.4.1)
ctypes.foreign (version: 0.4.1)
ctypes.stubs (version: 0.4.1)
ctypes.top (version: 0.4.1)
Run Code Online (Sandbox Code Playgroud)
所以,看起来,在ctypes伞下有4个库.一个基本库和一些额外的库,它们提供了一些默认情况下不需要的功能.
不,让我们尝试使用它们 ocamlbuild
ocamlbuild -package ctypes yourprogram.native
Run Code Online (Sandbox Code Playgroud)
或者,没有ocamlbuild直接ocamlfind:
ocamlfind ocamlopt -package ctypes yourprogram.ml -o yourprogram.native
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,有一个package选项,您可以通过该选项传递找到的包的名称ocamlfind,并且它将自动对编译器可见.