2013-07-02 95 views
7

我一直在研究一个Haskell库包,它需要在Windows上定制.dll和.lib才能与某些操作系统API交谈。 .lib通过extra-libraries字段链接到库中,并将该DLL安装在cabal包目录中,其中包含data-files。如果我创建一个使用我的包的测试可执行文件(在build-depends字段中),它希望链接相同。但是,如果我创建一个使用我的包的测试可执行文件(在build-depends字段中),它希望链接相同。 lib用于编译库 - 即使它只是调用库函数,而不是.lib公开的任何内容。很明显,它需要在运行时访问.dll,但这是可以预料的。需要.lib也很奇怪。图书馆用户还需要编译库所需的静态.lib文件?

我预计.lib已经链接到由Cabal/GHC为我的库生成的.a文件中。这不是这种情况吗?如果是这样,有人可以解释为什么这样吗?

回答

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 

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

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

+0

有没有办法强制它使用'ld -r'而不是'ar'作为香草库?我试过添加'ld-options:-r',但它似乎没有做任何事情(大概是因为'ld'没有被使用?) –

+0

@TomSavage不,我认为这是不可能的。但我不是cabal的专家。 – Yuras

相关问题