2013-12-12 2 views
0

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를 사용하여 말한다

, 나는 여러 장소에 배치하려고했지만, 이러한 시도는 결실되지 않았습니다 오류를 제거합니다.

  1. 어디에서 Makefile에 -fPIC를 배치해야합니까?
  2. -fPIC 제안이 유용합니까? Makefile 자체에 분명한 적자가 있습니까? 컴파일을 막을 수 있습니까?

답변

1

내가 공유 라이브러리에 GHC의 .o 인을 몰아 내려고 유사한 문제에 직면하고 (그래서 당신의 제안이 정확) GHC 그냥 바로 -shared 플래그를 사용하지 않고 -fPIC을 무시 실현했습니다. 자세한 내용은 link을 참조하십시오. 이 티켓은«해결»이라고 표시된 링크로 표시되지만 2009 년부터 ghc 명령 행에서 실제로 변경된 사항은 없습니다. 간단히 말하면 ghc 구현에있는 이유는 하스켈 코드에서 별도의 공유 라이브러리를 작성하는 것입니다.

+0

OP는 공유 객체가 필요 없기 때문에 gcc -shared Fibonacci.o test.o -o test'에서'-shared'를 제거하는 것만으로도 좋습니다. – Armali

관련 문제