2011-04-18 89 views
2

我想建立一個項目來獲取我的.hs代碼和我的主要.c程序,並通過使用LLVM編譯器生成一個靜態鏈接的可執行文件。我可以通過ghc命令行選項來創建一個.hs文件,生成存根,並使用ghc編譯和鏈接驅動程序應用程序。但是,我在Xcode中遇到了各種問題。如何使用Xcode LLVM編譯器編譯並使用Haskell作爲C庫?

我的第一個問題是我當然需要在Xcode中使用32位編譯環境。這解決了,我不得不擺弄路徑來明確包含HsFFI.h。這解決了,我得到一個鏈接錯誤:

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」庫:

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

我缺少什麼或者做錯了?

+0

只是檢查,但你*通過使用GHC作爲C編譯器支持的路徑得到它的工作(a la http://www.haskell.org/haskellwiki/Calling_Haskell_from_C)? – 2011-04-18 21:37:37

+0

是的,我能夠 - 我使用的代碼張貼在我的其他SO問題:http://stackoverflow.com/questions/5665209/performance-considerations-of-haskell-ffi-c雖然我不得不稍微改變他的編譯行首先沒有Driver.cpp;它生成了存根和東西,然後重新運行他給出的實際行。 – Nektarios 2011-04-18 21:39:01

回答

2

呃 - 它看起來像我的問題的答案是detailed here,告訴我如何痛苦地添加一噸.a's到我的項目。並且this blog post提供了一些有用的提示,以幫助他們走上正軌。

雖然如果有人告訴我「嘿等待,有一個更簡單的方法比迭代計算失敗的代價」這將是很棒的。因爲我想重複使用這個框架好幾次,這真是一種讓事情變化的真正痛苦!

相關問題