函数应用于lablgtk中的参数过多

函数应用于lablgtk中的参数过多,gtk,ocaml,lablgtk,Gtk,Ocaml,Lablgtk,我需要一些帮助来理解为什么下面的代码无法编译。我正在尝试将GSourceView2放置在lablgtk中的垂直框中。我已经根据这个修改了代码 我得到的错误有点神秘: Error: This function has type GtkSourceView2_types.source_view Gtk.obj -> GSourceView2.source_view It is applied to too many arguments; maybe you fo

我需要一些帮助来理解为什么下面的代码无法编译。我正在尝试将GSourceView2放置在lablgtk中的垂直框中。我已经根据这个修改了代码

我得到的错误有点神秘:

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中。两个和的签名看起来非常相似(很多可选参数后跟一个单位),所以我不太确定我遗漏了什么。关于我所缺少的任何帮助都会非常有用,因为我对这种语言还是相当陌生。

通过使用
new
调用类的单参数构造函数
GSourceView2.source\u view
,而不是多参数函数
GSourceView2.source\u view


虽然我不熟悉Gtk库,但似乎与类同名的函数将返回这些类的实例,因此您可能只需删除
new
即可解决问题,因为您不熟悉这种语言,我还将向您概述我是如何解决这个问题的,以便您对环境有一种感觉……不幸的是,这有时会令人痛苦

因此,您得到的错误暗示缺少
cma
cmxa
(我不确定您是否使用了ocamlopt或ocamlc)

让我们从源头开始…这对我们来说都是可用的

~/.opam/archives/
或仅通过
opam源代码lablgtk
。我们进去看到一个元文件,这是用于
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`
然后我们可以执行
定位lablgtksource2.cma
查找-名称lablgtksourceview2.cma
。在我的平台OSX上,两者都不存在。在对lablgtk网站进行了一些调查和谷歌搜索之后,这是因为相关的gtk代码本身不在我的机器上

对于OSX上的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配置路径问题, 这是我的
PKG\u CONFIG\u PATH=/opt/X11/lib/pkgconfig/:/usr/local/ceral/libxml2/2.9.2/lib/pkgconfig/

对于使用基于Debian的机器的OCaml用户,这应该包括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

如果您更喜欢使用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

然后,
/SanityCheck
这在OS X上对我有效。

我在删除新代码时遇到的新错误是:引用未定义的全局“GSourceView2”哪个linux?Ubuntu?很好的解释!感谢您深入研究ocaml工具链。
(* I just named it stackoverflow.ml, you can also use ocamlopt instead of ocamlc *)

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