“模板Haskell + C”错误的解决方法?

时间:2014-10-19 09:29:07

标签: haskell ghc template-haskell

我遇到以下情况:

GHC bug #9010使得无法使用GHC 7.6安装库B.处理TH时,GHCi会启动并尝试加载库X,但是会失败并显示

之类的消息
Loading package charsetdetect-ae-1.0 ... linking ... ghc:
~/.cabal/lib/x86_64-linux-ghc-7.6.3/charsetdetect-ae-1.0/
libHScharsetdetect-ae-1.0.a: unknown symbol `_ZTV15nsCharSetProber'

(“未知符号”的实际名称因机器而异)。

此问题是否有任何变通方法(当然除了“不使用模板Haskell”之外)?也许库X必须以不同的方式编译,或者有一些方法可以阻止它加载(因为它不应该在代码生成期间调用)?

1 个答案:

答案 0 :(得分:4)

这实际上是默认情况下7.8切换到动态GHCi的主要原因之一。它不是试图支持每个目标文件格式的每个特性,而是构建动态库并让系统动态加载器处理它们。

尝试使用g ++选项-fno-weak构建。从g ++手册页:

  

<强> -fno弱

     

不要使用弱符号支持,即使它是由链接器提供的。默认情况下,G ++将使用弱符号(如果可用)。此选项仅用于测试,不应由最终用户使用;它会导致劣质代码并且没有任何好处。在将来的G ++版本中可能会删除此选项。

__dso_handle还有另一个问题。我发现你至少可以通过链接一个定义该符号的文件来加载库并显然工作。我不知道这个黑客是否会导致任何问题。

所以在X.cabal中添加

if impl(ghc < 7.8)
    cc-option: -fno-weak
    c-sources: cbits/dso_handle.c

cbits/dso_handle.c包含

void *__dso_handle;