我需要一些帮助来理解为什么以下代码无法编译。我试图将一个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.button和GSourceView2.source_view的签名看起来非常相似(许多可选的args后跟一个单元),所以我不太确定我缺少什么。对我所缺少的任何帮助都会非常有帮助,因为我对这门语言还很陌生。
答案 0 :(得分:2)
由于您是这门语言的新手,我还将向您概述我如何解决这个问题,以便您了解环境......不幸的是,这有时会让您感到痛苦。
所以你得到的错误暗示缺少cma
或cmxa
(我不确定你是否使用了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.cma
或find . -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/
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 }}