gpt4 book ai didi

haskell - 库用户还需要编译库所需的静态 .lib 吗?

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

我一直在研究一个 Haskell 库包,它需要 Windows 上的自定义 .dll 和 .lib 才能与某些 OS API 对话。 .lib 使用 extra-libraries 链接到库中。字段和 DLL 安装在 cabal 包目录中,data-files .

出于某种原因(我不是以任何方式进行链接的专家,但这似乎很奇怪)如果我创建一个使用我的包的测试可执行文件(在 build-depends 字段中),它想要链接到同一个 .lib 使用编译库 - 即使它只是调用库函数,而不是 .lib 公开的任何内容。显然,它需要在运行时访问 .dll,但这是意料之中的。也需要 .lib 似乎很奇怪。

我希望 .lib 在安装时已经链接到 Cabal/GHC 为我的库生成的 .a 文件中。不是这样吗?如果是这样,有人可以解释为什么会这样吗?

最佳答案

看起来您想要部分链接(参见 --relocatable 手册页中的 ld 标志)。正如我从资料中看到的那样,cabal使用仅部分链接的库,为 ghci 编译.来自 Distribution.Simple.GHC (buildLib 函数):

whenVanillaLib False $ do
(arProg, _) <- requireProgram verbosity arProgram (withPrograms lbi)
Ar.createArLibArchive verbosity arProg
vanillaLibFilePath staticObjectFiles

whenProfLib $ do
(arProg, _) <- requireProgram verbosity arProgram (withPrograms lbi)
Ar.createArLibArchive verbosity arProg
profileLibFilePath profObjectFiles

whenGHCiLib $ do
(ldProg, _) <- requireProgram verbosity ldProgram (withPrograms lbi)
Ld.combineObjectFiles verbosity ldProg
ghciLibFilePath ghciObjFiles

whenSharedLib False $
runGhcProg ghcSharedLinkArgs

您可以看到,对于 vanilla 和分析库, cabal只需调用 ar实用程序(见 createArLibArchive)。对于 ghci它调用 ld-r标志(这是 --relocatable 的快捷方式)(参见 combineObjectFiles )。

所以, cabal实际上并没有为 vanilla 库做任何链接,它只是结合了目标文件。其实 cabal不知道最终应用程序是否会使用您的 extra-lib 中的任何符号,所以行为似乎是合理的。

关于haskell - 库用户还需要编译库所需的静态 .lib 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17437164/

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