问题
Suppose one is using the stack
build tool to make a Haskell library (importing packages from Hackage, and so forth) to be used with a C/C++ project in which main
is located in C/C++.
Supposing your project is named Lib.hs
(which uses external libraries from hackage), is there a way to use stack to export your Lib.o
, Lib.hi
, and Lib_stub.h
to be consumed by a C/C++ compiler like gcc
or g++
?
EDIT: A related question might be: "how can one use Stack as a build tool to be used with a Haskell & C/C++ project in which main
is located in C/C++?
EDIT2: Upon reflection, one way to solve this problem would be to use Stack as usual, but migrate your C/C++ main function to Haskell. Is this the best way to do it? Are there huge performance costs to this or anything I should be aware of?
回答1:
Stack can't really do this on its own.
There's support for generating so called "foreign libraries" added to Cabal, but it's not in a released version, yet. See commit 382143 This will produce a shared library that dynamically links against the dynamic versions of each Haskell package used.
You can build your package with stack and then after the fact you can assemble a single native library. In the Galua project we do this with a custom Setup.hs and a separate linking script.
The result of this linking process is that you get a standalone statically linked library suitable for inclusion in a C project: libgalua.a
.
Do note that for creating standalone libraries on Linux suitable for being linked into a shared library that you'll need to recompile GHC to generate PIC static libraries (macOS does this by default).
来源:https://stackoverflow.com/questions/40444010/how-to-use-haskells-stack-build-tool-to-export-a-library-to-be-consumed-by-c-c