Haskell、GHC、win32、开罗
Posted
技术标签:
【中文标题】Haskell、GHC、win32、开罗【英文标题】:Haskell, GHC, win32, cairo 【发布时间】:2011-06-19 04:46:48 【问题描述】:我在 Windows 上遇到 ghci+cairo 的问题。当我尝试加载时,例如像这样的“ghci -package cairo”,它会失败并出现以下错误:
正在加载包 random-1.0.0.2 ... 链接 ... 完成。 加载包haskell98 ...链接...完成。 正在加载包 syb-0.1.0.2 ... 正在链接 ... 完成。 正在加载包 base-3.0.3.2 ... 链接 ... 完成。 正在加载包 mtl-1.1.0.2 ...链接...完成。 : C:\Users\alexeys\AppData\Roaming\cabal\cairo-0.12.0\ghc-6.12.3\HScairo-0.12.0.o: 未知符号`_cairo_surface_destroy' 正在加载包 cairo-0.12.0 ... 链接 ...:无法加载包 'cairo-0.12.0'即使是最简单的程序也不能在交互模式下运行,例如 cairo 包附带的“Text.hs”。然而,使用 'ghc --make' 编译后,一切都按预期工作,所以它不是“缺少 dll”的问题 - 一切就绪。
我使用“filemon”查看“ghci”加载的内容,在日志中我可以看到“libcairo-2.dll”(并且这个库定义了“_cairo_surface_destroy”符号)被成功找到并加载,所以我没有真的不明白——它还想要什么?
【问题讨论】:
也许这是一个“线程”问题?最近有一个关于 SOE 图形库的 Haskell 咖啡馆线程表现出类似的行为“来自 Haskell 表达式悬挂学校的代码”-haskell.org/pipermail/haskell-cafe/2011-January/088697.html。抱歉,我不知道分辨率。 libcairo-2.dll 是否在路径名中有空格的位置?能否请您发布您正在使用的 ghci 版本(无论如何这看起来像是一个链接器错误)? 可能是stdcall
/ccall
不匹配。 DLL中的符号名称是否有@4
之类的后缀?
我正在使用 HaskellPlatform 2010.2.0.0 附带的 ghc 6.12.3。 'libcairo-2.dll' 在 C:\GTK\bin 中,没有空格或任何东西。此外,我用“filemon”查看了 ghci 的作用,可以看出它在进程中加载了这个库 - 所以可能不是库位置问题。
对于库,该符号的 nm 给出:“68df9f58 T _cairo_surface_destroy”。我没有看到任何错误,并且定义了符号。图书馆取自
【参考方案1】:
我怀疑你遇到了很多我刚刚做的问题。
我最近尝试在 Windows 上使用 Haskell 和 ZeroMQ 做一些事情。 GHC 在 Windows 上运行,ZeroMQ 有一个 MingW32 端口,并且有一个标准的 ZeroMQ Cabal 包,所以我认为这可以工作。
但是:
GHC 仅部分支持 Windows 上的动态链接。见here。 ZeroMQ Cabal 包依赖于libzmq
的静态版本。
Windows 上的 GHC 对其库和 dll 使用 MingW32 约定。
ZeroMQ 仅在其 MingW32 端口中构建动态 .dll
,而不是 .a
静态存档。
我无法将所有部分组合在一起,所以我的 windows 盒子上没有基于 Haskell 的 ZeroMQ 编码。
【讨论】:
【参考方案2】:请运行 ghc-pkg 检查是否一致
【讨论】:
以上是关于Haskell、GHC、win32、开罗的主要内容,如果未能解决你的问题,请参考以下文章