Gcc 如何将Haskell代码集成到C程序中?

Gcc 如何将Haskell代码集成到C程序中?,gcc,ghc,Gcc,Ghc,尽管网上有一些教程展示了如何使用Haskell函数编译C程序,但每个教程都使用ghc编译C代码。在“真实世界”中,C代码文件将使用gcc编译 我的目标是从Haskell代码创建.o文件,然后将它们链接到核心C程序。下面是一个基本的工作示例 Fibonacci.hs: {-# LANGUAGE ForeignFunctionInterface #-} module Fibonacci where import Foreign import Foreign.C.Types fibonacci ::

尽管网上有一些教程展示了如何使用Haskell函数编译C程序,但每个教程都使用ghc编译C代码。在“真实世界”中,C代码文件将使用gcc编译

我的目标是从Haskell代码创建.o文件,然后将它们链接到核心C程序。下面是一个基本的工作示例

Fibonacci.hs:

{-# LANGUAGE ForeignFunctionInterface #-}
module Fibonacci where
import Foreign
import Foreign.C.Types
fibonacci :: Int -> Int
fibonacci n = fibs !! n
    where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
fibonacci_hs :: CInt -> CInt
fibonacci_hs = fromIntegral . fibonacci . fromIntegral
foreign export ccall fibonacci_hs :: CInt -> CInt
测试c:

#include "Fibonacci_stub.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
    int i;
    hs_init(&argc, &argv);
    i = fibonacci_hs(42);
    printf("Fibonacci: %d\n", i);
    hs_exit();
    return 0;
}

运行make时,首先:ghc编译器将生成一个Fibonacci_stub.h和一个Fibonacci.o文件。第二:gcc编译器将从test.c文件生成test.o文件。最后,gcc编译器应该链接.o文件并生成可执行文件

而是提供了以下错误:

/usr/bin/ld:Fibonacci.o:在创建共享对象时,不能使用针对未定义符号“base\u GHCziBase\u plusInt\u closure”的重新定位R_X86\u 64\u PC32;用-fPIC重新编译 /usr/bin/ld:最终链接失败:错误值

输出显示要使用-fPIC,我尝试将其放置在多个位置,但这些尝试在消除错误方面没有取得成效

  • 我应该将-fPIC放在Makefile中的什么位置
  • fPIC的建议有用吗?Makefile本身是否存在明显的缺陷,这将阻止编译
    我在尝试将ghc的.o放入共享库时遇到了类似的问题,我意识到ghc只是忽略了-fPIC而没有立即共享标志(所以你的建议是正确的)。有关详细讨论,请参见此。ticket by link标记为“已解决”,但自2009年以来ghc命令行中没有任何实际更改。简而言之,这种行为的原因在于ghc实现,唯一建议的解决方案是从Haskell代码中构建一个单独的共享库。

    或者,由于OP似乎不需要共享对象,他可以尝试从
    gcc-shared Fibonacci.o test.o-o test
    中删除
    -shared
    all: test 
    test: Fibonacci.o test.o  
        gcc -shared Fibonacci.o test.o -o test 
    test.o: test.c
        gcc -c -I/usr/lib/ghc/include test.c 
    Fibonacci.o: Fibonacci.hs
        ghc -c -O Fibonacci.hs
    clean:
        rm *.o *.hi test *_stub.h