外部函数接口(FFI)如何与堆栈一起使用?
我正在关注一些FFI教程和示例(here和here),我想知道在使用堆栈时应该改变什么?外部函数接口(FFI)如何与堆栈一起使用?
在这些示例中,使用gcc -c -o termops.o termops.c
将源文件C编译为目标文件,并使用ghc --make -main-is FfiEx -o ffi_ex FfiEx.hs termops.o
将其包含在gcc编译中。如何使用堆栈完成相同的操作?
这是FFI C项目的最小代码,正如我所能想象的那样。
$ cd c-proj
c-proj$ ls
Main.hs c-proj.cabal c_file.c
这些文件的内容:
-
c-proj.cabal
:介绍了name: c-proj version: 0.1.0.0 cabal-version: >= 1.22 build-type: Simple executable main main-is: Main.hs build-depends: base >= 4.9 c-sources: c_file.c
-
Main.hs
:唯一Haskell的源文件{-# LANGUAGE ForeignFunctionInterface #-} module Main where foreign import ccall "plus_ten" plusTen :: Int -> IO Int main = do n <- plusTen 2 print n
-
c_file.c
:C源文件#include<stdio.h> int plus_ten(int n) { printf("%d + 10\n", n); return n + 10; }
然后,如果你想使用堆栈,可以运行stack init
。
$ stack init
<< Shell output snipped >>
$ stack build
<< Shell output snipped >>
$ stack exec main
2 + 10
12
好吧,这就是我正在寻找的。特别是c-sources部分似乎是我所缺少的。后续,有没有办法使用目标代码文件,而不是c源文件? (File.o而不是File.c) – user668074
是的,当然!在'executable main'下,添加以下条目:'extra-lib-dirs:“。”'和'extra-libraries:File.o'。 – Alec
只是挑剔:你可以做得更少。只需将“build-type:Simple”添加到c-proj.cabal的开始部分,即可清除Setup.hs。 – Krom
Stack不是正确的组件 - Cabal是。 Stack是一个工具,可以帮助您了解如何解决您的依赖关系,而Cabal描述了如何构建您的项目。 – Alec
我从来没有真正直接使用cabal。我直接去使用堆栈。不能堆叠做一切cabal可以? – user668074
不完全。堆栈旨在补充Cabal,而不是替代它。在内部,Stack对Cabal有一定的依赖。 – Alec