2015-05-06 66 views
3

我在OCaml的FFI其次this tutorial並通過OPAM安裝Ctypes如何使從OPAM安裝的庫可用於OCaml?

opam install ctypes 

然而,OCaml中沒有找到該模塊:

open Ctypes 
(* ... *) 

我收到的錯誤:

Unbound module Ctypes 

它看起來像我需要讓OCaml知道我的Ctypes安裝位置在哪裏?我是否需要更新一些路徑變量讓OCaml查找通過OPAM安裝的庫?

這是Ubuntu 15.04,OCaml 4.01.0,OPAM 1.2.0。

+0

你用什麼構建工具?你能告訴我們你如何編譯你的代碼? – PatJ

回答

6

在您的系統上安裝某些東西並不會使它對編譯器自動可見,這不僅適用於OCaml,而且適用於大多數常規系統,例如C或C++等等。

這意味着您需要將某些標誌傳遞給編譯器,或編寫Makefiles或使用某些項目管理系統。

在OCaml中,我們有相當成熟的基礎設施,特別是與opam配合得很好。我不想深入解釋,只是一個快速的概述。

ocamlfind工具用於在系統上查找庫。它在想法上有點接近pkg-config,但在設計上卻有很大的不同。它包裝編譯器工具以將選項傳遞給它們。

ocamlbuild是一個奇特的瑞士刀,這是每個OCamler的武器庫必備的。它是一種知道所有其他工具的工具,以及如何將它們粘合在一起。我會說這是編譯你的項目的首選方式,尤其是小的。

oasis在精神上接近於autotools,但不是那種通用的,是在前提下編寫的,應該很容易使用。事實上這很容易,但仍然非常靈活和強大。

有了這個概述,我們可以直接去解決您的問題。所以你已經安裝了ctypes。現在讓我們來看看包在ocamlfind的角度如何在您的系統中可見。最簡單的方法是列出所有的包,可見ocamlfind找到​​有:

$ 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) 

所以,它看起來像,說下ctypes的傘這兒有4個庫。一個基本庫和一些額外的庫,提供一些功能,默認情況下不需要。

沒有讓我們嘗試用ocamlbuild

ocamlbuild -package ctypes yourprogram.native 

或者直接用ocamlfind使用它們,而不ocamlbuild

ocamlfind ocamlopt -package ctypes yourprogram.ml -o yourprogram.native 

正如你可以看到,有一個package選項,您可以向其中通由ocamlfind發現包的名稱,它會被自動地可見編譯器。