【问题标题】:Missing symbol in Haskell libclang binding: clang_toggleCrashRecoveryHaskell libclang 绑定中缺少符号:clang_toggleCrashRecovery
【发布时间】:2011-05-13 12:59:54
【问题描述】:

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

有人知道该怎么做吗?

【问题讨论】:

  • 看起来您可以关闭另一个问题,因为您现在正在链接,但由于缺少符号而失败。

标签: haskell linker clang


【解决方案1】:

我可以在 Arch Linux / x86_64 上重现这个:我的 libclang build 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 库存档。在我的 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,它 not 有这个符号,而谷歌确实出现了一些包含它的旧标题。所以我最好的猜测是这个符号在 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

    请“更新阴谋”,你应该很高兴。 或者,您可以从https://github.com/chetant/LibClang获取源代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      相关资源
      最近更新 更多