2011-05-13 17 views
1

がlibClangのバグを持っている、そして私は私が得る最後の秘密結社でそれをインストールします。私は今、クランIを使用していますGHCでスクリプトをコンパイルしたい欠落記号: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 --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

あなたはリンクしていますが、欠落しているシンボルでは失敗しているように見えます。 –

答えて

3

私はアーチのLinux/x86_64の上でこれを再現することができます。私のlibclangは

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... 

とテストプログラムをリンクする、不足している記号についてemits a warningを構築:

$ 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 

import Clang 
main = print "yes" 

はで失敗します

これらの種類のリンカーエラーを解決するプロセスは、どのC l 。

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

それはlibclangの異なるバージョンでのみ利用可能なものであるかもしれないという手がかりである:シンボルが私のlibclangにインストールの検索で住んでいるibraryアーカイブは、私はこのシンボルを見つけることができません。私はclang/llvm 2.9を使用しています。これはではありません。はこのシンボルを持っていますが、googleはそれを含む古いヘッダーを表示しています。だから、私の推測では、このシンボルは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