从C++调用Haskell库

16

我正在使用C++Qt构建一个应用程序,它使用了一个用Haskell编写的库作为后端。如何将Haskell库的接口导出到C++中?

当Haskell库中的函数使用像intfloat这样的简单类型时,这不是问题,但是当它们使用结构作为参数时该怎么办?在这种情况下,最可扩展的解决方案是什么?


1
使用UNIX域套接字进行IPC怎么样? - Joe Hillenbrand
1
IPC在双方都需要进行编组。这是某种解决方案,但仍然需要大量工作,并且效率不如可能的高。 - remdezx
1
我并没有亲自尝试过,但它可能对您有用:https://github.com/wavewave/fficxx - Yuras
很遗憾,这是用 Haskell 调用 C++ 的方法。这不是我要找的,但还是谢谢! - remdezx
2个回答

3
您需要编写Haskell代码来将这些数据结构转换为您可以在Haskell中使用的数据结构。 c2hs工具在这方面非常有用:http://hackage.haskell.org/package/c2hs 虽然该工具似乎是为了从Haskell调用C而设计的,但在某种程度上,它也非常适合相反的操作 - 它允许您将复杂的C类型转换为Haskell类型。由于您公开的函数需要采用C类型(通常是指向复杂结构的指针),因此可以A)构造适当的C结构,并B)使用c2hs提供的功能将这些结构转换为Haskell,以便您可以使用它们。
另请注意,使用c2hs风格生成的工具,您不需要将所有内容都转换。您只需生成访问器以查看实际关心的C数据结构的部分即可。

2
嗯,实际上,他想生成C头文件/包装以从C++代码中调用Haskell函数。而不是编写C++代码的Haskell绑定。我认为你读反了。 - Jeremy Cochoy
这是个好观点,但我仍然希望有更简单的方法来做到这一点。 - remdezx
2
C语言无法访问Haskell数据结构,因为它们包含thunks等内容,通常与运行时绑定。这意味着你的Haskell必须需要一个包装层,以某种方式与C结构进行交互。如果没有更多关于你想要做什么的细节,那么这就是我能给出的最好建议。如果有更具体的问题,我可以提供更多指导。 - sclv
好的,我明天会尝试这个。非常感谢您的建议,我很快会汇报我的结果 ;) - remdezx
另一个想法可能是找出如何从Haskell调用您的GUI代码,使Haskell成为前端和后端,而C ++仅用于UI。 - Joe Hillenbrand

3
晚来的聚会,但我认为你想使用这个: 具体地说,像foreign export ccall foo :: Int -> IO Int这样的内容将生成一个头文件。
#include "HsFFI.h"
extern HsInt foo(HsInt a0);

请查看链接以获取更多详细信息(例如如何将其集成到您的C++程序中)。

2
这个回答并没有为原帖作者所说他已经知道如何做的事情增加任何内容,尤其是它没有解释如何处理复杂的结构。 - bmaderbacher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接