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

Tom*_*age 7 dll haskell static-libraries cabal cabal-install

我一直在研究一个Haskell库包,它需要Windows上的自定义.dll和.lib来与某些OS API进行通信..lib与extra-libraries字段链接到库中,DLL安装在cabal包目录中data-files.

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

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

Yur*_*ras 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
Run Code Online (Sandbox Code Playgroud)

您可以看到,对于普通库和分析库,cabal只需调用ar实用程序(请参阅createArLibArchive)。因为ghcild使用-rflag 进行调用(这是 的快捷方式--relocatable)(请参阅combineObjectFiles)。

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