2011-12-29 32 views
12

我有一個文件Tools.ml,其中包含我自己編寫的一些常用實用函數。在.../Code/下我有幾個文件夾,每個文件夾都包含一個項目。我的問題是我應該在什麼地方放置這個Tools.ml,以便.../Code/下的所有文件夾和文件可以通過Open Tools共享此模塊。在OCaml中放置共享公用程序模塊的位置?

希望我的問題很清楚......有沒有人有很好的解決方案?

EDIT1:繼@ gasche的回答,我已經寫tools.ml如下:

module Tools = 
    struct 
    let a_function = ... 
    ... 
    end 

然後我編譯它,並做了ocamlfind install tools META tools.cmo tools.cmx tools.ml的建議,看起來進展順利。然後,我已經寫了test.ml如下:

open Tools 

let f = Tools.a_function 

然後我​​編譯它,然後我得到了一個錯誤:

File "test.ml", line 1, characters 0-1: 
Error: Error while linking test.cmo: 
Reference to undefined global `Tools' 

誰能告訴我發生了什麼?

回答

13

你可以打包爲一個獨立的庫,與其他OCaml的庫安裝它,對它的訪問,從您的項目,作爲一個庫。

一個非常簡單的方式做,這是寫一個META文件ocamlfind。創建一個目錄,讓你可​​以輕鬆掌握「個人圖書館」項目。假設你有tools.mltools.mli,你的代碼依賴於一些findlib包(如unixbigarray)。你META應該是這樣的:

name="tools" 
description="personal collection of utilities" 
version="0.1" 
requires="unix,bigarray" 
archive(byte)="tools.cmo" 
archive(native)="tools.cmx" 

一旦你寫這個META文件,很容易讓ocamlfind「安裝」庫(如果你想刪除它),並在其他使用它項目。要安裝,語法爲ocamlfind install <name> <meta-file> <file1> <file2> ...,其中<file1>, <file2>..是您希望在安裝目錄中包含的文件。您必須至少有tools.cmitools.cmo(和tools.otools.cmx進行本地編譯),但最好還有tools.mli(例如,如果您要提供代碼tools.ml)。

ocamlfind install tools META tools.cmi tools.cmo tools.o tools.cmx tools.mli 

(當然tools.cmo等有存在,那就是你必須install你編譯你的包後,如果您已經使用ocamlbuild,他們很可能是在一個_build子目錄,所以ocamlfind install ... _build/tools.cmo ...。)

從你的許多項目,您可以輕鬆地使用圖書館,無論是使用ocamlfind toold直接,如果這是你已經做的編譯程序

ocamlfind ocamlc -package tools .... 

或者通過ocamlbuild提供的工具,例如,將package(tools)添加到您的標籤。

要重新安裝庫,如果你做了更改,並希望它從你的項目進入

ocamlfind remove tools 
ocamlfind install tools META ... 

你也可以處理這一切通過oasis,這是對的ocamlfind/ocamlbuild自動之上的一層這個流程。我不太熟悉oasis這樣的例子,但我認爲這樣的例子應該同樣簡單(一個文件庫),如果你希望以後擴展你的庫(例如它也可以處理文檔生成,預編譯配置...)。

+0

感謝您的評論......您可以看看我在OP中的測試嗎? – SoftTimur 2012-01-02 05:39:27

+1

@SoftTimur:在你的情況下,正確的編譯命令是'ocamlfind ocamlc -package tools -linkpkg test.ml -o test'。 '-package工具'選項添加軟件包,'-linkpkg'選項鍊接它以生成可執行文件(在生成可執行文件時需要,而不是在編譯爲'.cmo'時需要)。你也可以使用'ocamlbuild -tag'包(工具)「test.byte」(未測試)。 – gasche 2012-01-02 06:48:14

+0

@gashe:'ocamlfind ocamlc -package tools -linkpkg test.ml -o test'只有在'test.ml'與可執行文件'tool'位於同一個文件夾中時才起作用...你知道爲什麼嗎? – SoftTimur 2012-01-02 08:34:08

相關問題