2011-12-25 61 views
4

說,我有mylibrary.ml它提供了library.c的包裝,我想字節碼編譯並提供mylibrary.ml作爲其他ocaml代碼的庫。將它編譯爲字節碼(我不考慮將ocaml編譯爲本地代碼)會產生大量文件,我想知道是否有任何理由讓它們全部保留下來?或者將它們全部提供給圖書館的其他用戶?是否有理由保留.cmo或只有.cma?

I(到目前爲止)明白,我所需要的字節碼庫對象mylibrary.cma,這樣我可以在ocaml的頂層使用在MyLibrary作爲

ocaml mylibrary.cma 

或我可以

#load "mylibrary.cma";; 
從ocaml的

腳本。然後,編譯界面mylibrary.cmidllmylibrary.so(其中包含代碼的C部分)需要上述工作。非編譯的接口定義文件mylibrary.mli很適合用於文檔目的。

但是有沒有什麼理由保留mylibrary.cmo文件,如果我有mylibrary.cma文件?在什麼樣的情況下,人們也會喜歡這種情況?

編輯:我的意思是,我需要構建在makefile中.cmo,然後用它來構建.cma,但我想刪除後這個.cmo,保持小幅目錄清潔。

回答

3

因此,不同的文件顯然目的是(限制這時候字節碼編譯器):

mylibrary.mli - 人類可讀的接口定義(並非嚴格需要,編譯器只需要。CMI)
mylibrary.cmi - 編譯接口,需要編譯代碼調用時在MyLibrary
library.o - C對象文件
dlllibrary.so - 共享所作的.o
dlllibrary.a的庫對象 - 字節碼對象 - 所作的.o
mylibrary.cmo的靜態庫對象從mylibrary.ml
mylibrary.cma編譯 - 字節碼庫

然後,mylibrary.cma(與mylibrary.cmidlllibrary.so)從頂層加載在MyLibrary時,需要:

#load "mylibrary.cma";;

OR

人們可以編譯與mylibrary.cmamylibrary.cmidlllibrary.so也需要)動態鏈接一個字節碼程序:

ocamlc mylibrary.cma <program>.ml

與字節碼對象動態鏈接,而不是字節碼庫,(需要的文件:mylibrary.cmomylibrary.cmidlllibrary.so):

ocamlc dlllibrary.so mylibrary.cmo <program>.ml

(注:然後與運行的字節碼:ocamlrun -I . <program>,假定dlllibrary.so是在當前目錄)

靜態鏈接與物體CTS(所需文件:mylibrary.cmomylibrary.cmiliblibrary.a

ocamlc -custom liblibrary.a mylibrary.cmo <program>.ml

OR

靜態地庫對象鏈接(需要的文件:mylibrary.cmamylibrary.cmiliblibrary.a

ocamlc -custom -I . mylibrary.cma <program>.ml

所以根據將來如何使用圖書館,需要不同的文件。除了.mli僅適用於人類閱讀器,並且不需要從C庫編譯的目標文件.o(但在某些情況下編譯爲本地代碼時需要)。

2

你甚至應該保留庫的源代碼。在升級Ocaml編譯器時(例如從3.12升級到未來的3.13版本),經常會遇到以前的*.cmo*.cma文件,如果不進行重新編譯,將無法正常工作。

假設你可以隨時清潔並重新編譯的東西(比如你有兩個傳統指標cleanallmake),您可以只保留*.cma

+1

是的,我當然會保留源代碼。我只是在想,有沒有人想要使用.cmo而不是.cma。 – 2011-12-25 17:24:30

相關問題