【发布时间】:2015-03-26 18:54:26
【问题描述】:
我正在学习如何使用 FFI,并从一个非常简单的示例开始,从 Haskell 调用 C 函数。
这一切都在 Windows 7、64 位、Visual Studio Community 2013 下。
C 看起来像这样:
_declspec(dllexport) int line(int m, int b, int x) {
return m * x + b;
}
我已将 VS 编译器设置为生成 64 位 DLL,它会生成一个名为 simpleclib.dll 的 DLL(也有匹配的 .lib 文件)
匹配的 Haskell 如下所示:
module Main (main) where
foreign import ccall "line" cline :: Int -> Int -> Int -> Int
main = do
putStr "hello,world\n"
putStr (show y)
y = cline 2 5 10
GHC 是在上个月 7.8.3 内下载的。
ghc 的命令行是这样的:
c:\> ghc foreign -L. -lsimpleclib
这运行成功,按预期生成 .EXE。
运行程序会在 BEX64 上产生应用崩溃:
问题事件名称:BEX64 应用程序名称:foreign.exe 应用程序版本:0.0.0.0 申请时间戳:551048a6 故障模块名称:StackHash_0981 故障模块版本:0.0.0.0 故障模块时间戳:00000000 异常偏移量:0000000000000000 异常代码:c0000005 异常数据:0000000000000008 操作系统版本:6.1.7601.2.1.0.256.4 区域设置 ID:1033 附加信息 1:0981 附加信息2:09817cdf87ca03322f39545f3e74c62d 附加信息 3:31c0 附加信息4:31c0a543af0be952ecd86b6ee71cc83a
我也尝试过使用 Data.Int.Int64 的参数定义。结果一样。
有人有什么想法吗?
谢谢, 顺手
【问题讨论】:
-
使用
CInt,而不是Int。不确定这是否是唯一的问题,从未尝试链接到 Windows dll。 -
好主意。刚试了一下。结果相同。到目前为止,我已经尝试过 Int、CInt、Int32 和 Int64,认为这可能是某种堆栈未对齐的事情。都给出相同的结果。稍微深入了解调试器会发现根本问题是(当然)0x0000000000000000(64 位 0)处的访问冲突。奇怪,因为我看不到可以进行任何明显的调整。