2013-02-07 83 views
1

我希望在我的OCaml .ml文件中使用模塊Std。我試過#load "Std",但編譯器抱怨。如何在OCaml文件中加載模塊?

如何在OCaml中加載模塊?

+0

'#'指令並非真正用於編譯的項目。這是編譯行的問題。 – nlucaroni

+0

那我該如何使用'Std'模塊? –

+0

儘管didierc提到使用「open」,但它被認爲是不好的做法(除了在本地環境中)。這是因爲可以覆蓋先前聲明的函數。你應該在答案中調用'ModuleA.v'。它更清晰,代碼複雜,你知道'v'來自哪裏。 – nlucaroni

回答

4

您必須首先編譯您希望包含的模塊,然後將編譯文件的位置提供給模塊的編譯命令(取決於它),然後在最終編譯命令行中提供它。

讓我們看看以下實例文件foo/moduleA.ml

let v = 1 

和文件bar/moduleB.ml

open ModuleA 
let w = v 

的命令:

$ cd foo 
$ ocamlc -c moduleA.ml 
$ cd .. 

會產生moduleA.cmomoduleA.cmi。前者是模塊的字節碼對象(如原始對象文件中的.o文件,但包含字節碼數據和文本),後者是由自動生成的.mli文件生成的字節碼編譯頭。該字節碼頭是編譯器編譯依賴於ModuleA的文件所必需的。

$ cd bar 
$ ocamlc -I ../foo -c moduleB.ml 
$ cd .. 

將生產moduleB.cmo,這取決於ModuleA成功,因爲先前的命令已經成功,因爲我們指示編譯器到哪裏尋找與-I命令行參數的依賴關係,其次的路徑第一個模塊。

最後的命令下面將從兩個模塊生成的字節碼可執行文件:

$ ocamlc -I foo -I bar moduleA.cmo moduleB.cmo -o prog.byte 

模塊必須按照這個順序來提供,讓編譯器知道依賴關係第一。此時參數-I指示在哪裏可以找到.cmo文件。

在你的情況,你必須因此使用-I <location of std.cmi>爲編輯正確的相位和-I <location of std.cmo>(或std.cma,如果它是一個庫),第二階段(鏈接階段)。如果您可以在一個命令(即ocamlc -I foo foo/moduleA.ml bar/moduleB.ml -o prog.byte)中組合兩個階段,並且如果cmocmi文件都在同一個目錄中,則只有一個參數就足夠了。