2011-05-13 84 views
1

有libClang一個bug,然後我在最後小集團安裝它,我得到:缺少符號:clang_toggleCrashRecovery

[13 of 13] Compiling Clang   (src/Clang.hs, dist/build/Clang.o) 
In file included from ./src/Clang/FFI_stub_ffi.h:6, 

       from src/Clang/FFI_stub_ffi.c:4:0: 

/usr/local/lib/ghc-7.0.3/include/HsFFI.h:29:0: 
    warning: "__STDC_LIMIT_MACROS" redefined 

<command-line>:0:0: 
    note: this is the location of the previous definition 
src/Clang/FFI_stub_ffi.c: In function ‘prim_getCString’: 

src/Clang/FFI_stub_ffi.c:33:0: 
    warning: assignment discards qualifiers from pointer target type 
src/Clang/FFI_stub_ffi.c: In function ‘prim_toggleCrashRecovery’: 

src/Clang/FFI_stub_ffi.c:2181:0: 
    warning: implicit declaration of function ‘clang_toggleCrashRecovery’ 
Registering LibClang-0.0.9... 

當我現在想編譯GHC一個腳本,使用鏘我得到:

ghc --make test.hs -L. 
[1 of 1] Compiling Main    (test.hs, test.o) 
Linking test ... 
/home/foo/.cabal/lib/LibClang-0.0.9/ghc-7.0.3/libHSLibClang-0.0.9.a(FFI_stub_ffi.o): In function `prim_toggleCrashRecovery': 
FFI_stub_ffi.c:(.text+0x1577): undefined reference to `clang_toggleCrashRecovery' 
collect2: ld returned 1 exit status 

某人的想法該怎麼辦?

+0

得到的源代碼看起來你可以關閉另一個問題,因爲你現在正在鏈接,但失敗的一個缺少符號。 – 2011-05-13 17:06:37

回答

3

我可以重現這對Arch Linux的/ x86_64的:我libclang建立emits a warning關於失蹤符號,

src/Clang/FFI_stub_ffi.c:2181:1: 
    warning: implicit declaration of function ‘clang_toggleCrashRecovery’ 
       [-Wimplicit-function-declaration] 
Registering LibClang-0.0.9... 
Installing library in /home/dons/.cabal/lib/LibClang-0.0.9/ghc-7.0.3 
Registering LibClang-0.0.9... 

和鏈接一個測試程序:

import Clang 
main = print "yes" 

失敗:

$ ghc --make A.hs 
Linking A ... 
/home/dons/.cabal/lib/LibClang-0.0.9/ghc-7.0.3/libHSLibClang-0.0.9.a(FFI_stub_ffi.o): 
       In function `prim_toggleCrashRecovery': 
FFI_stub_ffi.c:(.text+0x3513): undefined reference to `clang_toggleCrashRecovery' 
collect2: ld returned 1 exit status 

解決這些類型的鏈接器錯誤的過程是識別哪個C l 。該符號住在我libclang搜索安裝ibrary存檔,我找不到這個符號:

$ find . -type f -exec grep toggleCrashRecovery {} \; 
$ grep toggleCrashRecovery /usr/lib/llvm/* 
$ grep toggleCrashRecovery /usr/lib/llvm/*/* 
zsh: no matches found: /usr/lib/llvm/*/* 

這是一個線索,這可能是唯一可用的不同版本libclang的東西。我使用的是clang/llvm 2.9,它確實有而不是有這個符號,而谷歌確實出現了一些包含它的較舊的頭文件。所以我最好的猜測是這個符號在LLVM中不再可用,因此當前的haskell/libclang包依賴於LLVM/Clang 2.8。

解決方案:

下載libclang源,

$ cabal unpack libclang 

,並修補它刪除到toggle*函數的引用。

$ ghc --make A.hs 
[1 of 1] Compiling Main    (A.hs, A.o) 
Linking A ... 

一個補丁版本是在這裏:http://www.galois.com/~dons/tmp/LibClang-0.0.10.tar.gz

我也轉發此信息給作者。

+1

完美!它現在有效 – develhevel 2011-05-14 19:30:40