为什么用haskell / stack编译GTK(gi-gtk)应用程序是不可重现的?

时间:2018-03-30 13:08:19

标签: haskell gtk haskell-stack

我创建了一个在Haskell中通过gi-gtk使用GTK的应用程序,使用堆栈(lts-9.2)管理的依赖项。我在Fedora 26上成功编译了它。然后我也成功地在其他Linux发行版上执行了二进制文件。

过了一会儿,我想在其他系统(基本操作系统)上编译相同的应用程序。我克隆了在项目目录中名为stack setup的存储库,然后是stack build。它抱怨一些缺少依赖项,所以我安装了它们,最后,我从GHC得到一个关于我自己的代码的错误:

Not in scope: 'GTK.popoverPopdown'
Perhaps you meant one of these:
  'GTK.popoverModal' (imported from GI.Gtk)
  'GTK.popoverPosition' (imported from GI.Gtk)
Module 'GI.Gtk' does not export 'popoverPopdown'.

为什么呢?在我查看文档(https://hackage.haskell.org/package/gi-gtk-3.0.17/docs/GI-Gtk-Objects-Popover.html)时,有popoverPopdown,但没有popoverModalpopoverPosition

然后我切换到另一台机器与另一个Linux发行版(Ubuntu Studio)并得到相同的错误。最后我拿了一台装有Fedora 27的机器,做了同样的事情并得到了另一个错误(也在我的应用程序代码中):

Couldn't match expected type 'Maybe b1'
            with actual type 'GTK.Image'
In the second argument of 'GTK.buttonSetImage', namely 'icon'
In a stmt of a 'do' block: btn `GTK.buttonSetImage` icon

再次,文档(https://hackage.haskell.org/package/gi-gtk-3.0.17/docs/GI-Gtk-Objects-Button.html#g:26)声称与GHC不同。有人可以向我解释一下发生了什么吗?

回答其中一条评论: 以下是在上述系统中安装的GTK版本。尽管如此,GHC抱怨Haskell代码,我认为所有Haskell代码都是从Stackage下载的。在stack build期间,我的系统是否在本地生成了依赖项?

  • Ubuntu Studio 16.04 LTS:libgtk2.0-0 v2.24.30,libgtk-3-0 v3.18.9
  • 基本操作系统:libgtk2.0-0 v2.24.30,libgtk-3-0 v3.18.9
  • Fedora 26:gtk2 v2.24.31,gtk3 v3.22.21
  • Fedora 27:gtk2 v2.24.32,gtk3 v3.22.26

1 个答案:

答案 0 :(得分:1)

好的,现在我可以看到(与我之前的想法相反)在构建n包期间,在我的计算机上生成Haskell-GTK绑定 。确实在GTK v3.18中没有像gi-gtk这样的东西,这就是为什么根本没有生成Haskell函数gtk_popover_popdown的原因。我猜它与popoverPopdown类似。

现在我需要记住,这个Stackage / Hackage包是的另一种。我必须跟踪我正在构建应用程序的GTK的精确版本,而不是依赖于gtk_button_set_image