函数应用于lablgtk中的参数过多
我需要一些帮助来理解为什么下面的代码无法编译。我正在尝试将GSourceView2放置在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
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