2013-04-28 76 views
0

我想編譯一個非常小的小插曲來看看lablgtk2是如何工作的。OCaml-Wodi第2部分:編譯使用什麼安裝

(* file: base.ml *) 
let main() = 
    let window = GWindow.window() in 
    window#show(); 
    GMain.Main.main() 

let _ = main() 

我有它正確地通過wodi32包管理器安裝和檢查PGK-lib文件夾,看看有gMain.cmx/CMI和gWindow.cmx/CMI文件(以及相應的.ml和.mli文件)。然而,當我運行下面的編譯命令:

 
$ ocamlc -I +lablgtk2 -o base lablgtk.cma gtkInit.cmo base.ml 

我得到以下錯誤:

 
File "base.ml", line 4, characters 15-29: 
Error: Unbound module GWindow 

什麼是不正確的?爲什麼找不到GMain和GWindow模塊?是否有一個替代命令行編譯指令,我可以使用它會產生一個可執行文件(即Windows/Linux風格)?例如,有沒有辦法直接鏈接GMain和GWindow模塊,以便編譯器明白它們不會被解除綁定?

古怪的是,當我運行下面的命令,事情似乎工作,但只產生一個目標文件(即base.o,以及base.cmx,base.cmi):

 
$ ocamlfind opt -package lablgtk2 -linkpkg base.ml 

如何將該對象轉換爲可執行文件?

回答

1

如果您使用通過ocamlfind安裝的庫(幾乎所有的庫現在提供ocamlfind支持),請始終使用ocamlfind作爲ocaml(c | opt)的包裝。 只有ocamlfind可以解析這些庫的'META'文件。 ocamlfind可以將庫安裝到不同的位置(取決於你的findlib.conf和某些環境變量),普通ocaml可能不會用'+ lib'符號找到它們。

下面應該工作:

ocamlfind ocamlopt -package lablgtk2.auto-init -linkpkg base.ml -o myprog.exe 
ocamlfind ocamlc -package lablgtk2.auto-init -linkpkg base.ml -o myprog_byte.exe 

'汽車-INIT' 將增加gtkInit爲您服務。

+0

真棒,這完美的作品。謝謝@rafix! – 9codeMan9 2013-04-28 19:51:50