gpt4 book ai didi

haskell - “Template Haskell + C” 错误的解决方法?

转载 作者:行者123 更新时间:2023-12-04 04:25:28 24 4
gpt4 key购买 nike

我有以下情况:

  • Library X是 C 中某些代码的包装器。
  • Library A取决于库 X。
  • Library B使用 Template Haskell 并依赖于库 A。

  • 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'

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

    有没有解决这个问题的方法(当然,除了“不要使用 Template Haskell”)?也许库 X 必须以不同的方式编译,或者有某种方法可以阻止它加载(因为无论如何都不应该在代码生成期间调用它)?

    最佳答案

    这确实是 7.8 默认切换到动态 GHCi 的主要原因之一。它不是尝试支持每种目标文件格式的每个特性,而是构建动态库并让系统动态加载器处理它们。
    尝试使用 g++ 选项 -fno-weak 构建.从 g++ 手册页:

    -fno-weak

    Do not use weak symbol support, even if it is provided by the linker. By default, G++ will use weak symbols if they are available. This option exists only for testing, and should not be used by end-users; it will result in inferior code and has no benefits. This option may be removed in a future release of G++.

    __dso_handle 还有另一个问题.我发现您至少可以通过链接定义该符号的文件来加载库并显然可以工作。我不知道这个 hack 是否会导致任何问题。
    所以在 X.cabal 添加
    if impl(ghc < 7.8)
    cc-option: -fno-weak
    c-sources: cbits/dso_handle.c
    在哪里 cbits/dso_handle.c包含
    void *__dso_handle;

    关于haskell - “Template Haskell + C” 错误的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26449154/

    24 4 0