【问题标题】:Calling Haskell library from C++从 C++ 调用 Haskell 库
【发布时间】:2013-07-22 20:30:08
【问题描述】:

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

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

【问题讨论】:

  • UNIX domain socket做IPC怎么样?
  • IPC 需要两边编组。那是某种解决方案,但它仍然需要大量工作并且效率不高。
  • 我没试过,但它可能对你有用:github.com/wavewave/fficxx
  • 不幸的是,这是从 Haskell 调用 c++ 的。不是我要找的,但谢谢!

标签: c++ api haskell interface ffi


【解决方案1】:

您需要编写 haskell 代码来将这些数据结构编组为您可以在 Haskell 中使用的数据结构。 c2hs 工具在这方面很有帮助:http://hackage.haskell.org/package/c2hs

虽然该工具似乎是为从 Haskell 调用 C 而设计的,但它在相反的意义上也非常有用——它允许您将复杂的 C 类型编组为 Haskell 类型。由于您公开的函数需要采用 C 类型(通常是指向复杂结构的指针),因此您可以 A)构造适当的 C 结构,并且 B)使用 c2hs 提供的功能,然后将这些结构编组到公开函数中的 Haskell ,以便您可以与他们合作。

还请注意,使用 c2hs 样式生成工具,您不需要编组所有内容。您可以只生成访问器来查看您真正关心的 C 数据结构部分。

【讨论】:

  • 嗯,实际上,他想生成 C 头文件/包装以从 C++ 代码中调用 haskell 函数。不要编写 C++ 代码的 haskell 绑定。我想你已经读过相反的内容了。
  • 这点很好,但我仍然希望有更简单的方法来做到这一点。
  • Well C 不能访问 Haskell 数据结构,因为它们包括 thunk 等,因此通常与运行时相关联。这意味着你的 Haskell 必然需要一个包装层,让它以某种方式与 c 结构交互。如果没有关于你想做什么的更多细节,这是我能给出的最好的建议。如果有更具体的问题,我可以提供更多指导。
  • 好的,我明天试试。非常感谢您的建议,我会尽快报告我的结果;)
  • 另一个想法可能是弄清楚如何从 Haskell 调用您的 GUI 代码,使 Haskell 的前端和后端都使用仅用于 UI 的 C++。
【解决方案2】:

聚会迟到了,但我想你想用这个:

特别像foreign export ccall foo :: Int -> IO Int。这将生成一个标题,例如:

#include "HsFFI.h"
extern HsInt foo(HsInt a0);

查看链接了解更多详情(例如如何集成到您的 C++ 程序中)。

【讨论】:

  • 这个答案并没有增加 OP 所说的他知道如何做的事情,特别是它没有解释如何处理复杂的结构。
猜你喜欢
  • 2013-05-13
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多