7

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

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

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

4

1 回答 1

1

看起来您想要部分链接(请参阅手册页--relocatable中的标志)。ld正如我从源代码中看到的,cabal只使用部分链接库,编译为ghci. 从Distribution.Simple.GHCbuildLib函数):

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调用(这是 的快捷方式)(请参阅combineObjectFiles)。ld-r--relocatable

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

于 2013-07-03T11:26:08.620 回答