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

How to Use Haskell's Stack Build Tool to Export a Library to Be Consumed by C/C++?

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

假设您的项目名为 Lib.hs(它使用来自 hackage 的外部库),有没有办法使用堆栈导出您的 Lib.oLib.hiLib_stub.h 由 C/C++ 编译器使用,如 gccg++?

编辑: 一个相关的问题可能是:“如何将 Stack 用作与 Haskell & C/C+ 一起使用的构建工具+ main 位于 C/C++?

的项目

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

Stack 不能真正做到这一点。

Cabal 支持生成所谓的 "foreign libraries",但尚未发布。请参阅提交 382143 这将生成一个共享库,该共享库动态链接到每个使用的 Haskell 包的动态版本。

您可以使用堆栈构建您的包,然后您可以 assemble 一个单一的本地库。在Galua project we do this with a custom Setup.hs and a separate linking script.

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

请注意,要在 Linux 上创建适合链接到共享库的独立库,您需要重新编译 GHC 以生成 PIC 静态库(macOS 默认执行此操作)。