我有以下情况:
GHC错误#9010使得无法使用GHC7.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必须以不同的方式编译,或者有某种方法阻止它加载(因为在代码生成过程中不应该调用它)?
发布于 2014-10-19 12:13:56
这确实是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;
https://stackoverflow.com/questions/26449154
复制