#haskell #linker #clang
#haskell #компоновщик #лязг
Вопрос:
есть ошибка с 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
у кого-нибудь есть идея, что делать?
Комментарии:
1. Похоже, вы можете закрыть другой вопрос, поскольку вы сейчас связываете, но сбой с отсутствующим символом.
Ответ №1:
Я могу воспроизвести это в 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
Я также переслал эту информацию автору.
Ответ №2:
Спасибо Дону за быстрое исправление. Эта проблема исправлена в последней версии Hackage:http://hackage.haskell.org/package/LibClang-0.1.0
Пожалуйста, «обновите cabal», и все должно быть готово. В качестве альтернативы, вы могли бы получить исходный код из https://github.com/chetant/LibClang