2011-04-18 4 views
2

내 .hs 코드와 주된 .c 프로그램을 가져 와서 LLVM 컴파일러를 사용하여 정적으로 링크 된 실행 파일을 만들도록 프로젝트를 설정하려고합니다. ghc 명령 행 옵션을 통해 .hs를 빌드하고, 스텁을 생성하며, ghc를 사용하여 드라이버 애플리케이션을 컴파일하고 링크 할 수 있습니다. 그러나 Xcode에서는 다양한 문제가 발생합니다.Xcode LLVM 컴파일러를 사용하여 Haskell을 C 라이브러리로 컴파일하고 사용할 수 있습니까?

첫 번째 문제는 물론 Xcode에서 32 비트 컴파일 환경을 사용해야한다는 것이 었습니다. 이를 해결하기 위해 HsFFI.h를 명시 적으로 포함하는 경로를 만들어야했습니다. I가 없거나 잘못하고 있어요 무엇

ghc -no-hs-main -fPIC -c ForeignExportCost.hs 
ghc -no-hs-main -shared ForeignExportCost.o -o ForeignExportCost.a 

:

Ld "build/Debug/FFI Test.app/Contents/MacOS/FFI Test" normal i386 
    cd "/Users/rcl/TestXCodeProjects/FFI Test" 
    setenv MACOSX_DEPLOYMENT_TARGET 10.6 
    /Developer/usr/bin/clang -arch i386 
     -isysroot /Developer/SDKs/MacOSX10.6.sdk 
     "-L/Users/rcl/TestXCodeProjects/FFI Test/build/Debug" 
     "-L/Users/rcl/TestXCodeProjects/FFI Test/FFI Test" 
     "-F/Users/rcl/TestXCodeProjects/FFI Test/build/Debug" 
     -filelist "/Users/rcl/TestXCodeProjects/FFI Test/build/FFI Test.build/ 
      Debug/FFI Test.build/Objects-normal/i386/FFI Test.LinkFileList" 
     -mmacosx-version-min=10.6 -framework Cocoa 
     "/Users/rcl/TestXCodeProjects/FFI Test/FFI Test/ForeignExportCost.a" 
     -o "/Users/rcl/TestXCodeProjects/FFI Test/build/Debug/FFI Test.app/ 
      Contents/MacOS/FFI Test" 

Undefined symbols for architecture i386: 
    "_hs_init", referenced from: 
     -[FFI_TestAppDelegate applicationDidFinishLaunching:] in FFI_TestAppDelegate.o 
    "_simpleFunction", referenced from: 
     -[FFI_TestAppDelegate applicationDidFinishLaunching:] in FFI_TestAppDelegate.o 
    "_hs_exit", referenced from: 
     -[FFI_TestAppDelegate applicationDidFinishLaunching:] in FFI_TestAppDelegate.o 
ld: symbol(s) not found for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

은 "simpleFunction는"이 같은 GHC를 사용하여 컴파일 할 "ForeignExportCost.a"라이브러리에 : 그건 내가 링커 오류가 발생, 해결 ?

+0

GHC를 C 컴파일러 (http://www.haskell.org/haskellwiki/Calling_Haskell_from_C)로 사용하여 지원되는 경로를 통해 확인하고 있습니다. –

+0

예 - 내가 할 수있었습니다 - 내 다른 질문에 게시 된 코드를 사용하고 있습니다 : http://stackoverflow.com/questions/5665209/performance-considerations-of-haskell-ffi-c 약간 변경해야하지만 그의 컴파일 라인은 처음에는 Driver.cpp를 가지지 않았다. 스텁과 물건을 생성 한 다음 실제 줄을 다시 실행합니다. – Nektarios

답변

2

흠 - 제 질문에 대한 답변이 detailed here 인 것처럼 보입니다. 내 프로젝트에 엄청난 양의 .a를 추가하는 방법을 알려줍니다. 그리고 this blog post은 길을 비우는 데 유용한 팁을주었습니다.

누군가가 "이봐, 기다려라, 반복적으로 실패한 deps를 알아내는 것보다 쉬운 방법이있다."라고 말하면 멋질 것입니다. 이 프레임 워크를 여러 번 재사용하기를 원하기 때문에 이것은 일을 시작하고 진행하는 진정한 고통입니다!

관련 문제