我花费了许多时间在Windows上安装gtk2hs和glade,今天终于成功。
一、参考资料
1、http://www.haskell.org/haskellwiki/Gtk2Hs
主要的安装指导。但写得不完整,没有注明成功所用的版本,我遇到的许多的问题也没有说明。
所以我才特意写了本文,给后来人一个参考,让他们少走弯路。
2、http://code.haskell.org/gtk2hs/INSTALL
个人观点,参考价值不大。
二、所用软件及版本
1、Haskell Platform for Windows
HaskellPlatform-2011.2.0.0-setup.exe
2、make及相关库文件,来自MinGW
其实不必安装make,只是http://www.haskell.org/haskellwiki/Gtk2Hs 上有讲就满装一下。
包括三个压缩包文件:
make-3.82-5-mingw32-bin.tar.lzma
libiconv-1.13.1-1-mingw32-dll-2.tar.lzma
libintl-0.17-1-mingw32-dll-8.tar.lzma
后面两个是make所需的运行库。.lzma格式压缩文件比较少见,用7-Zip或360压缩可以解开。
3、MSYS(MSYS-1.0.11.exe)
其实也不用装,就不讲了。
4、libxml2和libxml2-dev
来自Gnome
libxml2_2.7.7-1_win32.zip
libxml2-dev_2.7.7-1_win32.zip
5、glade3-3.6.7-with-GTK+.exe
来自bundled GTK and Glade binary
http://code.haskell.org/gtk2hs/INSTALL 说安装gtk+-bundle_2.16.6-20100912_win32.zip 。但glade3-3.6.7-with-GTK+.exe带有glade3更方便。
三、前期安装过程
1、安装Haskell Platform
笔者安装在D:/Program Files/Haskell Platform/2011.2.0.0
安装简单,没遇到任何问题
2、make及相关运行库
解压缩
make-3.82-5-mingw32-bin.tar.lzma
libiconv-1.13.1-1-mingw32-dll-2.tar.lzma
libintl-0.17-1-mingw32-dll-8.tar.lzma
到D:/Program Files/Haskell Platform/2011.2.0.0/mingw/bin
其中mingw32-make.exe复制成make.exe
3、MSYS
不装也行,不讲了
4、libxml2和libxml2-dev
解压缩到无空格的路径,例如:D:/prgs/libxml2
5、glade3-3.6.7-with-GTK+.exe
同Haskell Platform一样简单。
6、设置环境变量
PKG_CONFIG_PATH=D:/prgs/libxml2/lib/pkgconfig;D:/prgs/Gtk+/lib/pkgconfig;D:/Program Files/Haskell Platform/2011.2.0.0/mingw/lib/pkgconfig
INCLUDE=D:/prgs/libxml2/include;D:/prgs/Gtk+/include;D:/prgs/Gtk+/include/libglade-2.0;D:/Program Files/Haskell Platform/2011.2.0.0/mingw/include
PATH=D:/prgs/libxml2/bin;D:/prgs/Gtk+/bin;C:/Program Files/Haskell/bin;d:/Program Files/Haskell Platform/2011.2.0.0/lib/extralibs/bin;d:/Program Files/Haskell Platform/2011.2.0.0/bin;D:/Program Files/Haskell Platform/2011.2.0.0/mingw/bin;%PATH%;C:/Users/Administrator/AppData/Roaming/cabal/bin
路径PATH有些是安装程序时自动设好的。%PATH%表示原来的路径。
四、gtk2hs-buildtools
在DOS提示符下运行:
cabal install gtk2hs-buildtools
可能会出现一个抱怨,根据提示运行cabal update就行,这一步不会出现什么大问题。
到现在为止,一切都很顺利,但真正艰难的旅程即将开始......
五、正式安装gtk2hs
这一个充满挫折的道路。参考资料只有简单的一句cabal install gtk,但主要问题集中在这一步,这让我想起了自由软件的不人性化。真应该建议Haskell Platform安装包的制作者将gtk2hs(最好也包括glade)作为一个可选项做进安装包!
1、安装命令应改成:cabal install gtk --global
注意,命令中是gtk。
这只针对gtk2hs-0.12.0这一版本。要加上--global;否则,会报关于UserPackageDB的错误:
setup.exe: internal error: unexpected package db stack: [UserPackageDB] cabal: Error: some packages failed to install:
单独安装gtk2hs中的软件也要加--global。
2、安装GIO的出错
当安装到GIO时会报如下错误:
System/GIO/Volumes/VolumeMonitor.chs:56:5: Not in scope: `vmDriveStopButton'
System/GIO/Volumes/Drive.chs:59:5: Not in scope: type constructor or class `DriveStartStopType'
System/GIO/Volumes/Drive.chs:60:5: Not in scope: type constructor or class `DriveStartFlags' 这是源代码里的一个BUG。
要解决这个问题,就先要讲一下cabal安装软件。cabal update会建立一个目录C:/Users/Administrator/AppData/Roaming/cabal/packages/hackage.haskell.org。其下有两个文件:00-index.tar和00-index.tar.gz,里面包括可安装的软件包中的.cabal文件。用cabal info <软件包名称>可查看软件包信息。已安装的软件包记录在这个目录的build-reports.log文件里。运行cabal install <软件包名称>会从网上自动下载软件源码包,源码包就存放在这个目录下。例如gio的源码包gio-0.12.0.tar.gz就存放在C:/Users/Administrator/AppData/Roaming/cabal/packages/hackage.haskell.org/gio/0.12.0
软件安装后就存放在C:/Users/Administrator/AppData/Roaming/cabal下,从名字可以看得出这只是用户Administrator个人软件目录。如果安装时加上--global就存放在C:/Program Files/Haskell,这个目录下的软件就向所有用户开放的。
现在就讲处理方法。找到gio-0.12.0.tar.gz,解压缩到一个临时目录里。
打开文件System/GIO/Volumes/VolumeMonitor.chs,光标移到第56行:
vmDriveStopButton, 在这句前后加上两句,成为如下:
#if GLIB_CHECK_VERSION(2,22,0) vmDriveStopButton, #endif 为什么要这什么做呢?因为从这个源文件的后面可以得知vmDriveStopButton只在#if GLIB_CHECK_VERSION(2,22,0)才定义。
打开文件System/GIO/Volumes/Drive.chs,在第59-60行前后加上两句,成为如下:
#if GLIB_CHECK_VERSION(2,22,0) DriveStartStopType (..), DriveStartFlags (..), #endif 原因与上述雷同。
最后,在解压的根目录(例如:K:/tmp/gio-0.12.0)下运行:
cabal configure cabal build cabal install --global
注意不加gio,因为在解压的根目录。 以后您如果遇到软件源码中有BUG,您就可以依照上述方法进行处理。
3、安装pango出错
离开上一步解压软件源码包的目录,继续运行cabal install gtk --global,当安装到pango会遇到如下报错:
Preprocessing library pango-0.12.0... Graphics/Rendering/Pango/Structs.hsc:25:27: fatal error: glib-2.0/glib.h: No such file or directory compilation terminated.
出现这个问题应当是INCLUDE没设好,可是我前面有设啊。运行pkg-config --cflags gtk+-2.0检查一下: -mms-bitfields -ID:/prgs/Gtk+/include/gtk-2.0 -ID:/prgs/Gtk+/lib/gtk-2.0/include -ID:/prgs/Gtk+/include/atk-1.0 -ID:/prgs/Gtk+/include/cairo -ID:/prgs/Gtk+/include/pango-1.0 -ID:/prgs/Gtk+/include/glib-2.0 -ID:/prgs/Gtk+/lib/glib-2.0/include -ID:/prgs/Gtk+/include/libpng12
噢!原来是-ID:/prgs/Gtk+/include/glib-2.0,而不是-ID:/prgs/Gtk+/include。怎么改,我不会。不过我有办法,变通一下,绕过去,把glib-2.0整个目录复制上面其中的目录下(例如:D:/prgs/Gtk+/include/cairo)。如果您有更好的解决之道,麻烦不吝赐教,Thank you
如果先处理了,再运行cabal install gtk --global,当安装到pango就不会报错了。
就这样gtk2hs就安装好了。资料上讲内存至少1.5G,否则会死机,还好我的电脑内存是2G,没问题。
六、安装glade
cabal install glade --global
完成任务!!!
我也只是勉强完成安装,如果您有更好的处理方法,告诉我。