2013-07-02 41 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