gpt4 book ai didi

Haskell 动态库

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

http://www.vex.net/~trebla/haskell/so.xhtml描述如何编译共享库。

关于编译命令:

ghc -O2 -dynamic -shared -fPIC -o libEval.so Eval.hs hsbracket.c -lHSrts-ghc7.6.3

它说:

(Could you omit -dynamic to request static libraries of other packages? Not really, they were not generated with -fPIC. In particular it is illegal on x86_64.)



为什么会这样?在没有 libHS* 依赖项的情况下编译共享库应该怎么做?

最佳答案

既然Kaiko私下联系我寻求答案,那还不如贴在这里……

精简版

通过省略 -dynamic,您将尝试获取所有静态 .a 库并将它们链接到一个庞大的 .so 文件中。这些 .a 库本身是在没有 -fPIC 的情况下构建的。所有以 .so 文件结尾的代码都必须使用 -fPIC 构建(至少在 ELF x86-64 上)。因此,在这种情况下链接会失败,因为需要 -fPIC 但库不是使用 -fPIC 构建的。

长版

不同的构建方式之间存在一些差异
静态和动态库:

  • 它是作为 .a 存档还是作为 .so(或 .dll/.dynlib)对象构建的?
  • 它是用 -fPIC 构建的,是否与位置无关的代码?
  • 外部符号是否应该在同一个 DSO 或外部 DSO 中?

  • 原则上,这些东西的许多不同组合是有意义的
    但实际上只使用了几个。

    在 Linux (ELF) 上,有两种构建库的标准方法,
    全静态和全动态。在完全静态的方法中,答案
    上述问题 1、2、3 是:.a 存档,没有 -fPIC,相同的 DSO。在里面
    完全动态的方法 答案是:.so lib、-fPIC、外部 DSO。

    现在你想做的不一样了。您希望构建所有库
    作为 .a 文件,但带有 -fPIC 和外部符号,预计在
    相同的 DSO。然后,您可以将所有这些库链接到
    一个巨大的共享图书馆。所以关键的区别是 -fPIC 的使用,
    因为在 ELF(特别是 x86_64)代码上最终在共享库中
    必须使用 -fPIC 构建。

    相比之下,在 Windows 上,GHC 可以做你想做的事,链接所有
    将 Haskell 库(包括 RTS 等)整合到一个庞大的共享库中
    (.dll)。这是因为在 Windows 上(与 ELF 不同),位置无关
    代码无所谓。所以在 Windows 上,一个能够采取静态
    库并将它们链接到一个大型共享库。

    原则上这在 Linux 上也应该是可能的,如果所有的
    Haskell 库是静态构建的,但使用 -fPIC。这不是
    默认,这就是你不能省略 -dynamic 的直接原因
    在这种情况下,在 Linux 上。

    所以原则上,可以尝试重建 ghc 和核心库
    使用 -fPIC 标志从源代码,然后查看它是否可以省略
    -动态并将所有内容链接到一个巨大的共享库中。

    关于Haskell 动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27815467/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com