外部函数接口

虽然 cabal 支持在 Haskell 包中包含 C 和 C++库,但是存在一些错误。首先,如果你在 b.o 中使用 b.o 中定义的数据(而不是函数),并列出 C-sources: a.c, b.c,那么 cabal 将无法找到数据。这在 #12152 中有记录 。使用 cabal 时的解决方法是将 C-sources 列表重新排序为 C-sources: b.c, a.c。这在使用堆栈时可能不起作用,因为堆栈始终按字母顺序链接 C-sources,无论你列出它们的顺序如何。

另一个问题是你必须用 #ifdef __cplusplus 警卫包围头文件(.h)中的任何 C++代码。这是因为 GHC 不理解头文件中的 C++代码。你仍然可以在头文件中编写 C++代码,但是你必须用守卫包围它。

ccall 指的是呼召惯例 ; 目前支持 ccallstdcall(Pascal 惯例)。unsafe 关键字是可选的; 这减少了简单函数的开销,但是如果外部函数无限期地阻塞或者没有足够的权限来执行 1, 则可能导致死锁。