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、开罗的主要内容,如果未能解决你的问题,请参考以下文章

Ghc:部分编译 Haskell 代码?

在 Opensuse 42.3 上为 haskell 堆栈设置 ghc-8.2.1 时出现 ghc 完整性检查错误

GHC ccall 安全 VS ccall 不安全

GHC - Haskell 中的中缀声明

使用 GHC API 评估 Haskell 语句/表达式

确保两个 (G) ADT 在 (GHC) Haskell 中具有相同的底层表示