看起来您想要部分链接(请参阅手册页--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
调用(这是 的快捷方式)(请参阅combineObjectFiles)。ld
-r
--relocatable
所以,cabal
实际上并没有为 vanilla 库做任何链接,它只是结合了目标文件。实际上cabal
不知道最终应用程序是否会使用您的任何符号extra-lib
,因此行为似乎是合理的。