如何使用Haskell的堆栈构建工具导出C/C++消耗的库?

Geo*_*rge 7 haskell ffi haskell-stack

假设一个正在使用stack的构建工具,使一个Haskell库(从Hackage导入包,等等)与其中一个C/C++项目中使用main位于C/C++.

假设您的项目被命名为Lib.hs(使用外部库从hackage),有没有使用堆栈来导出的方式Lib.o,Lib.hi以及Lib_stub.h要通过C/C++编译器像消耗gccg++

编辑:一个相关的问题可能是:"如何使用Stack作为构建工具与Haskell和C/C++项目一起使用,该项目main位于C/C++中?

编辑2:经过反思,解决此问题的一种方法是像往常一样使用Stack,但将C/C++主函数迁移到Haskell.这是最好的方法吗?是否存在巨大的性能成本或我应该注意的任何事情?

glg*_*guy 4

堆栈本身并不能真正做到这一点。

Cabal 中添加了对生成所谓的“外部库”的支持,但尚未发布版本。请参阅提交382143这将生成一个共享库,该库动态链接到所使用的每个 Haskell 包的动态版本。

您可以使用堆栈构建包,然后可以组装单个本机库。在Galua项目中,我们使用自定义的Setup.hs和单独的链接脚本来完成此操作。

此链接过程的结果是您获得一个适合包含在 C 项目中的独立静态链接库:libgalua.a

请注意,要在 Linux 上创建适合链接到共享库的独立库,您需要重新编译 GHC 以生成 PIC 静态库(macOS 默认情况下会这样做)。