Haskell, GHC, win32, cairo

10
我在Windows上使用ghci+cairo遇到了问题。例如,当我尝试像这样加载时“ghci -package cairo”,它会失败并显示以下错误:
Loading package random-1.0.0.2 ... linking ... done.
Loading package haskell98 ... linking ... done.
Loading package syb-0.1.0.2 ... linking ... done.
Loading package base-3.0.3.2 ... linking ... done.
Loading package mtl-1.1.0.2 ... linking ... done.
: C:\Users\alexeys\AppData\Roaming\cabal\cairo-0.12.0\ghc-6.12.3\HScairo-0.12.0.o: unknown symbol `_cairo_surface_destroy'
Loading package cairo-0.12.0 ... linking ... : unable to load package `cairo-0.12.0'
即使是最简单的程序也无法在交互模式下工作,比如cairo包中附带的'Text.hs'文件。然而,编译后用'ghc --make'一切正常,所以这不是“缺少dll”的问题——一切都在正确的位置。
我使用'filemon'查看了"ghci"加载了什么,日志中我可以看到已找到并成功加载了'libcairo-2.dll'(并且该库定义了'_cairo_surface_destroy'符号),因此我真的不明白——它还想要什么?

也许这是一个“线程”问题?最近有一个 Haskell-cafe 的帖子提到 SOE 图形库表现出类似的行为:“来自 Haskell School of Expression 的代码挂起”- http://www.haskell.org/pipermail/haskell-cafe/2011-January/088697.html。很抱歉我不知道解决方法。 - stephen tetley
你能否检查一下 libcairo-2.dll 是否在路径名中包含空格?此外,你可以告诉我你正在使用哪个版本的 ghci 吗?(无论如何,这似乎是一个链接器错误)。 - John L
1
可能是 stdcall/ccall 不匹配。DLL 中的符号名称是否有像 @4 这样的后缀? - Simon Marlow
你能否使用nm命令检查符号是否在其中一个.o文件(可能是Graphics/Rendering/Cairo/Internal/Surfaces/Surface.o)中定义,但不在HScairo-0.12.0.o中?你的错误报告看起来类似于这个:http://hackage.haskell.org/trac/ghc/ticket/3951 - Jason Dagit
如果您在编译并加载已编译的代码后使用ghci会怎样呢? - Theo Belaire
显示剩余2条评论
2个回答

2
我怀疑你遇到了我最近遇到的许多问题。
我最近尝试在Windows上使用Haskell和ZeroMQ做一些事情。 GHC可以在Windows上运行,而ZeroMQ有一个MingW32端口,并且有一个标准的ZeroMQ Cabal软件包,所以我认为这会起作用。
然而:
- GHC在Windows上只支持动态链接的部分功能。请参见此处。 - ZeroMQ Cabal软件包依赖于libzmq的静态版本。 - Windows上的GHC使用MingW32约定来处理其库和dll文件。 - ZeroMQ在其MingW32端口中仅构建动态.dll,没有.a静态存档。
我无法使所有部分配合在一起,因此我的Windows电脑上没有基于Haskell的ZeroMQ编码。

0
请运行 ghc-pkg check 命令以查看是否一致。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接