Отсутствующий символ в привязке libclang на Haskell: clang_toggleCrashRecovery - PullRequest
1 голос
/ 13 мая 2011

есть ошибка с libClang, затем я устанавливаю ее с помощью cabal, в конце я получаю:

[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, который использует Clang, я получаю:

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

у кого-то есть идеи, что делать?

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

Я могу воспроизвести это на 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

Я также отправил эту информацию автору.

1 голос
/ 14 мая 2011

Спасибо Дону за быстрое исправление.Эта проблема исправлена ​​в последней версии Hackage: http://hackage.haskell.org/package/LibClang-0.1.0

Пожалуйста, обновите "cabal update", и вы должны быть готовы.Кроме того, вы можете получить источник от https://github.com/chetant/LibClang

...