如何在Windows上为Haskell开发设置Gtk?

时间:2017-11-14 08:04:16

标签: haskell gtk msys2

到目前为止,我已经安装了https://www.haskell.org/platform/windows.html

的完整版本

最初,pacman没有工作,所以我确实以

中的管理员mingw64.exe运行
C:\Program Files\Haskell Platform\8.2.1\msys

我更新了运行pacman -Syu的msys2系统并安装了所有Gtk库。我正在尝试使用堆栈编译https://github.com/mmsbrggr/hsudoku。我已经超过了丢失的dll错误,现在我得到以下内容:

  

haskell-gi-base-0.20.4:configure

     

- 使用以下方法构建包haskell-gi-base-0.20.4:         C:\ sr \ setup-exe-cache \ x86_64-windows \ Cabal-simple_Z6RU0evB_1.24.2.0_ghc-8.0.2.exe --builddir = .stack-work \ dist \ ca59d0ab configure --with-ghc = C:\用户\亚切克\应用程序数据\本地\程序\栈\ x86_64的窗口\ GHC-8.0.2 \ BIN \ ghc.EXE   --with-GHC-PKG = C:\用户\亚切克\应用程序数据\本地\程序\堆\ x86_64的窗口\ GHC-8.0.2 \ BIN \ GHC-pkg.EXE   --user --package-db = clear --package-db = global --package-db = C:\ sr \ snapshots \ 7eb65607 \ pkgdb --libdir = C:\ sr \ snapshots \ 7eb65607 \ lib --bindir = C:\ sr \ snapshots \ 7eb65607 \ bin --datadir = C:\ sr \ snapshots \ 7eb65607 \ share --libexecdir = C:\ sr \ snapshots \ 7eb65607 \ libexec --sysconfdir = C:\ sr \ snapshots \ 7eb65607 \ etc --docdir = C:\ sr \ snapshots \ 7eb65607 \ doc \ haskell-gi-base-0.20.4 --htmldir = C:\ sr \ snapshots \ 7eb65607 \ doc \ haskell-gi-base-0.20。 4 --haddockdir = C:\ sr \ snapshots \ 7eb65607 \ doc \ haskell-gi-base-0.20.4 --dependency = base = base-4.9.1.0 --dependency = bytestring = bytestring-0.10.8.1 --dependency = containers = containers-0.5.7.1 --dependency = text = text-1.2.2.2-9UQZjEJZQFSGMffj1Z5g00" - extra-include-dirs = C:\ Program Files \ Haskell   平台\ 8.2.1 \ MSYS \ mingw64 \包括"   " - extra-include-dirs = C:\ Program Files \ Haskell   平台\ 8.2.1 \ MSYS \ mingw64 \包括\ GLIB-2.0"   --extra-包括-显示目录= C:\用户\亚切克\应用程序数据\本地\程序\堆\ x86_64的窗口\ msys2-20150512 \ mingw64 \包括   --extra-include-dirs = C:\ Users \ Jacek \ Downloads \ glib-2.54.1" - extra-lib-dirs = C:\ Program Files \ Haskell   平台\ 8.2.1 \ MSYS \ mingw64 \ BIN" " - 额外-LIB-显示目录= C:\程序   Files \ Haskell Platform \ 8.2.1 \ msys \ usr \ bin"   --extra-LIB-显示目录= C:\用户\亚切克\应用程序数据\本地\程序\堆\ x86_64的窗口\ msys2-20150512 \ mingw64 \仓   --extra-LIB-显示目录= C:\用户\亚切克\应用程序数据\本地\程序\堆\ x86_64的窗口\ msys2-20150512 \ mingw64 \ lib中       进程退出代码:ExitFailure 1       日志已写入:C:\ Users \ Jacek \ Documents \ ExperimentingHaskell \ hsudoku.stack-work \ logs \ haskell-gi-base-0.20.4.log

Configuring haskell-gi-base-0.20.4...
Cabal-simple_Z6RU0evB_1.24.2.0_ghc-8.0.2.exe: Missing dependencies on foreign
libraries:
* Missing C libraries: gobject-2.0, glib-2.0, intl
This problem can usually be solved by installing the system packages that
provide these libraries (you may need the "-dev" versions). If the libraries
are already installed but in a non-standard location then you can use the
flags --extra-include-dirs= and --extra-lib-dirs= to specify where they are.

我能够找到包含,但我担心一些编译器选项包含在引号中。这可能是个问题吗?

在Windows上使用Haskell和Gtk进行开发时,如何正确添加开发文件?如何告诉Haskell编译器它可以找到包含的内容?

  

extra-include-dirs:[' C:\ Program Files \ Haskell   平台\ 8.2.1 \ MSYS \ mingw64 \包括&#39 ;,   ' C:\ Users \ Jacek \ Downloads \ glib-2.54.1',' C:\ Program Files \ Haskell   Platform \ 8.2.1 \ msys \ mingw64 \ include \ GLIB-2.0'] extra-lib-dirs:   [' C:\ Program Files \ Haskell Platform \ 8.2.1 \ msys \ mingw64 \ bin',   ' C:\ Program Files \ Haskell Platform \ 8.2.1 \ msys \ usr \ bin']

我的额外包含dirs在编译器输出中似乎是乱码。

2 个答案:

答案 0 :(得分:2)

我能够构建并运行示例' Hello World'使用haskell-gi repositorystack,版本1.6.3)在64位Windows(版本10.0.16299.125)上的Haskell Tool Stack上编程,如下所示:

  1. stack之前已经设置为使用GHC 8.0.2或GHC 8.2.2。

  2. 我按照64位Windows MSYS2 installer的说明,接受默认值和更新(如说明中所述)。

  3. 打开MSYS2 shell后,我使用pacman来安装包mingw64/mingw-w64-x86_64-pkg-config mingw64/mingw-w64-x86_64-gobject-introspection mingw64/mingw-w64-x86_64-gtksourceview3 mingw64/mingw-w64-x86_64-webkitgtk3。然后我回到了Windows'命令提示符。 (但是,我不能排除我可能安装了其他软件包。)

  4. 我为我的帐户设置了以下Windows环境变量(通过在Windows 10搜索栏中输入' env'查找`为您的帐户编辑环境变量')

    PKG_CONFIG_PATH=C:\msys64\mingw64\lib\pkgconfig
    XDG_DATA_DIRS=C:\msys64\mingw64\share
    

    步骤3和4基于page on the haskell-gi wiki

  5. 我在帐户的C:\msys64\mingw64\bin环境变量的开头附近添加了PATH。请参阅下面的步骤7,了解在路径上首先发现的内容的重要性。

  6. 我使用gi-gtk-test模板创建了一个新的Haskell项目simple,然后使用以下命令移动到其文件夹中:

    stack new gi-gtk-test simple
    cd gi-gtk-test
    

    在撰写本文时,创建了一个stack.yaml文件resolver: lts-10.1(GHC 8.2.2)。 bug in GHC 8.2.2表示它不适用于gi-gtk,因此我将其更改为resolver: lts-9.21以恢复为GHC 8.0.2。

  7. 这被证明是至关重要的一步:使用stack exec where -- pkg-configstack exec where -- zlib1.dll查看在PATH中首次遇到的版本stack }环境,我确保首次遇到的版本是C:\msys64\mingw64\bin\中的版本(通过更改PATH上的文件夹顺序或将不需要的zlib1.dll重命名为zlib1.dll.old)。 (我认为前者的其他版本导致错误信息有关'缺少C库'后者的其他版本导致对话框中包含有关dll的模糊信息。)

  8. 我将包gi-gtkhaskell-gi-base添加到gi-gtk-test.cabal文件中,如下所示:

    executable gi-gtk-test
      hs-source-dirs:      src
      main-is:             Main.hs
      default-language:    Haskell2010
      build-depends:       base >= 4.7 && < 5
                         , gi-gtk
                         , haskell-gi-base
    
  9. 我将Main.hs的内容更改为示例程序,即:

    {-# LANGUAGE OverloadedStrings, OverloadedLabels #-}
    
    module Main where
    
    import qualified GI.Gtk as Gtk  -- package gi-gtk
    import Data.GI.Base             -- package haskell-gi-base
    
    main :: IO ()
    main = do
      Gtk.init Nothing
      win <- new Gtk.Window [ #title := "Hi there" ]
      on win #destroy Gtk.mainQuit
      button <- new Gtk.Button [ #label := "Click me" ]
      on button #clicked (set button [ #sensitive := False,
                                       #label := "Thanks for clicking me" ])
      #add win button
      #showAll win
      Gtk.main
    
  10. 然后,以下工作按预期方式构建并运行示例程序:

    stack build
    stack exec gi-gtk-test
    

答案 1 :(得分:0)

毕竟,我已经设法编译并启动了使用Gtk库编写的示例Haskell程序。

这个要点是所采取措施的记录。

https://gist.github.com/bigos/62defeec09a06f18ee38daf644af5340