我创建了一个在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
,但没有popoverModal
或popoverPosition
。
然后我切换到另一台机器与另一个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
期间,我的系统是否在本地生成了依赖项?
答案 0 :(得分:1)
好的,现在我可以看到(与我之前的想法相反)在构建n
包期间,在我的计算机上生成Haskell-GTK绑定 。确实在GTK v3.18中没有像gi-gtk
这样的东西,这就是为什么根本没有生成Haskell函数gtk_popover_popdown
的原因。我猜它与popoverPopdown
类似。
现在我需要记住,这个Stackage / Hackage包是的另一种。我必须跟踪我正在构建应用程序的GTK的精确版本,而不是依赖于gtk_button_set_image
。