外部函数接口(FFI)如何与Stack一起使用?

时间:2017-10-05 02:15:06

标签: c haskell ffi haskell-stack

我正在关注一些FFI教程和示例(herehere),我想知道在使用堆栈时应该改变什么?

在示例中,源C文件使用gcc -c -o termops.o termops.c编译为目标文件,并使用ghc --make -main-is FfiEx -o ffi_ex FfiEx.hs termops.o包含在gcc编译中。如何使用堆栈完成等效?

1 个答案:

答案 0 :(得分:5)

这是我想象的最小的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,你可以运行stack init

$ stack init
<< Shell output snipped >>
$ stack build
<< Shell output snipped >>
$ stack exec main
2 + 10
12