2013-04-28 78 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