我有一个名为Foo.dll
的Windows DLL。它出口(以下其他东西):
extern "C" __declspec(dllexport) unsigned int Version();
如何编写调用此函数并打印出答案的Haskell程序?
我设法弄明白我可以这样写:
foreign import ccall "Version" cpp_Version :: CUInt
这编译得很好,但完全无法链接。这并不奇怪;在这一点上,GHC 不知道在哪里寻找这个功能。但我无法弄清楚我需要推动什么魔术按钮来实现这一目标。谁能告诉我如何成功建立这个?
(我也不能100%确定调用约定是ccall
还是stdcall
;有什么区别?)
答案 0 :(得分:1)
使用以下选项进行编译 可以正常工作:
ghc -O2 -L. -lFoo --make Wrapper
似乎添加-lFoo
告诉GHC查找Foo.dll
文件,添加-L.
告诉它将当前目录包含在DLL搜索路径中。
我不是100%确定这是在运行时加载DLL,还是以某种方式将DLL的代码静态链接到二进制文件中。 (!!)
将ccall
更改为stdcall
会导致发出大量警告(但编译后的代码仍能正常工作)。因此,出现 ccall
是正确的。
如果有人能够仔细检查我所写的内容并非完全无稽之谈,我仍然会感激...