Haskell 함수를 사용하여 C 프로그램을 컴파일하는 방법을 보여주는 웹 튜토리얼이 있지만, 모든 튜토리얼은 ghc로 C 코드를 컴파일한다. ``Real World ''C 코드 파일은 gcc를 사용하여 컴파일됩니다.하스켈 코드를 C 프로그램에 통합하는 방법은 무엇입니까?
내 목표는 하스켈 코드에서 .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
TEST.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;
}
메이크 :
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
https://dl.dropboxusercontent.com/u/14826353/fibonacci.tgz
먼저, make를 실행하십시오 GHC 컴파일러 것이다 세대 Fibonacci_stub.h 및 Fibonacci.o 파일을 삭제하십시오. 둘째 : gcc 컴파일러는 test.c 파일에서 test.o 파일을 생성합니다. 마지막으로 gcc 컴파일러는 .o 파일을 링크하고 실행 파일을 생성해야합니다.는 대신에이 오류가 제공됩니다
는/usr/빈/LD를 : Fibonacci.o가 : 공유 객체를 만들 때 '정의되지 않은 심볼`base_GHCziBase_plusInt_closure에 대한 재배치 R_X86_64_PC32 사용할 수 없습니다; -fPIC 는/usr/빈/LD로 다시 컴파일 : 최종 링크 실패 : 잘못된 값이
출력은 -fPIC를 사용하여 말한다
, 나는 여러 장소에 배치하려고했지만, 이러한 시도는 결실되지 않았습니다 오류를 제거합니다.
- 어디에서 Makefile에 -fPIC를 배치해야합니까?
- -fPIC 제안이 유용합니까? Makefile 자체에 분명한 적자가 있습니까? 컴파일을 막을 수 있습니까?
OP는 공유 객체가 필요 없기 때문에 gcc -shared Fibonacci.o test.o -o test'에서'-shared'를 제거하는 것만으로도 좋습니다. – Armali