函数应用于lablgtk

时间:2015-05-30 07:18:55

标签: gtk ocaml lablgtk

我需要一些帮助来理解为什么以下代码无法编译。我试图将一个GSourceView2放在lablgtk的垂直框内。我已经改编了Ocaml article

的代码
open GMain
open GdkKeysyms

let locale = GtkMain.Main.init ()

let main () =
  let window = GWindow.window ~width:320 ~height:240
                              ~title:"Simple lablgtk program" () in
  let vbox = GPack.vbox ~packing:window#add () in
  window#connect#destroy ~callback:Main.quit;

  (* Sourceview *)
  let _ = new GSourceView2.source_view ~height:240 ~width:320 ~packing:vbox#add () in

  window#show ();
  Main.main ()

let () = main ()

我得到的错误有点神秘:

Error: This function has type
         GtkSourceView2_types.source_view Gtk.obj -> GSourceView2.source_view
       It is applied to too many arguments; maybe you forgot a `;'.

但是,我可以创建一个GButton并设置其pack参数以将其放在vbox中。 GButton.buttonGSourceView2.source_view的签名看起来非常相似(许多可选的args后跟一个单元),所以我不太确定我缺少什么。对我所缺少的任何帮助都会非常有帮助,因为我对这门语言还很陌生。

2 个答案:

答案 0 :(得分:2)

由于您是这门语言的新手,我还将向您概述我如何解决这个问题,以便您了解环境......不幸的是,这有时会让您感到痛苦。

所以你得到的错误暗示缺少cmacmxa(我不确定你是否使用了ocamlopt或ocamlc)

让我们从源头开始......我们可以使用

~/.opam/archives/或仅opam source lablgtk。我们进入并查看META文件,这是ocamlfind

cat META之后,我们会在底部看到这个相关部分。

package "sourceview2" (
  exists_if = "lablgtksourceview2.cma,lablgtksourceview2.cmxa,lablgtksourceview2.cmxs"
  description = "Bindings for gtksourceview2"
  requires = "lablgtk2"
  archive(byte) = "lablgtksourceview2.cma"
  archive(native) = "lablgtksourceview2.cmxa"
)

好的,这意味着我们应该期望存在lablgtksourceview2.cma或.cmxa。我们可以做到

cd `ocamlfind query lablgtk`

然后我们可以执行locate lablgtksource2.cmafind . -name lablgtksourceview2.cma。在我的平台上,OS X既不存在也不存在。在lablgtk网站上进行一些调查和一般的谷歌搜索后,这是因为相关的gtk代码本身不在我的机器上。

对于OS X上的OCaml人,您需要

1) opam uninstall lablgtk
(* Make sure that your path is set up correctly for PKG_CONFIG_PATH=/opt/X11/lib/pkgconfig *)
2) brew install gtksourceview libxml2
3) opam install lablgtk lablgtk-extras

最后一步可能会废话。它很可能是一个pkg-config路径问题, 这是我的PKG_CONFIG_PATH = /opt/X11/lib/pkgconfig/:/usr/local/Cellar/libxml2/2.9.2/lib/pkgconfig/

对于OCaml人来说,我猜是基于Debian的机器,这应该包括Ubuntu, 虽然我不确定这是否是正确的包名。

1) opam uninstall lablgtk
2) apt-get install liblablgtksourceview2-ocaml-dev
(* Not sure what the correct pkgconfig stuff is on linux but shouldn't matter I imagine *)
3) opam install lablgtk lablgtk-extras

您可以在此之后再次检查.cma舞蹈并使用

进行检查
 pwd
/Users/Edgar/.opam/4.02.1/lib/lablgtk2
~/.o/4/l/lablgtk2 ❯❯❯ ls *.cma
lablglade.cma          lablgtksourceview2.cma
lablgtk.cma            lablrsvg.cma

是的,相关cma存在。 我们还可以仔细检查:

ocamlfind list | grep gtk
lablgtk2            (version: 2.18.0)
lablgtk2-extras     (version: 1.5)
lablgtk2-extras.configwin (version: 1.5)
lablgtk2.auto-init  (version: n/a)
lablgtk2.glade      (version: n/a)
lablgtk2.rsvg       (version: n/a)
lablgtk2.sourceview2 (version: n/a)

并且有相关的包sourceview2。

现在,这里的代码是完全自包含的:

#require "lablgtk2.sourceview2"
open GMain
open GdkKeysyms

let locale = GtkMain.Main.init ()

let main () =
  let window = GWindow.window ~width:320 ~height:240
                              ~title:"Simple lablgtk program" () in
  let vbox = GPack.vbox ~packing:window#add () in
  window#connect#destroy ~callback:Main.quit;

  (* Sourceview *)
  let _ = GSourceView2.source_view ~height:240 ~width:320 ~packing:vbox#add () in

  window#show ();
  Main.main ()

let () = main ()

我可以使用utop <the_file.ml>

成功运行它

如果您更喜欢使用ocamlc或ocamlopt,那么删除以#require开头的行,因为那只是utop,然后执行:

(* I just named it stackoverflow.ml, you can also use ocamlopt instead of ocamlc *)

ocamlfind ocamlc -package lablgtk2.sourceview2 -linkpkg stackoverflow.ml -o SanityCheck

然后在OS X上为我工作的./SanityCheck

答案 1 :(得分:1)

通过使用new,您正在调用类GSourceView2.source_view的单参数构造函数,而不是多参数函数GSourceView2.source_view

虽然我不熟悉Gtk库,但似乎与类名相同的函数将返回这些类的实例,因此您可以通过简单地删除{{1 }}