1

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

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的签名似乎非常相似(许多可选参数后跟一个单位),所以我不太确定我错过了什么。对我所缺少的任何帮助都会非常有帮助,因为我对这种语言还是很陌生。

4

2 回答 2

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/

对于我猜基于 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 <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

然后./SanityCheck在 OS X 上对我有用。

于 2015-06-02T20:48:19.930 回答
1

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

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

于 2015-05-30T07:34:24.207 回答