Я могу воспроизвести это на Arch 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...
и связывание тестовой программы:
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 этот символ находится. Выполняя поиск в моей установке libclang, я не могу найти этот символ:
$ 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, который не имеет этот символ, в то время как 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
Я также отправил эту информацию автору.