2013-07-02 8 views
7

Ho lavorato su un pacchetto di librerie Haskell che richiede un dll e .lib personalizzati su Windows per parlare con alcune API del sistema operativo. Il .lib è collegato alla libreria con il campo extra-libraries e la DLL è installata nella directory del pacchetto cabal con data-files.Il .lib statico richiesto per la libreria di compilazione è richiesto anche per gli utenti della libreria?

Per qualche motivo (non sono un esperto di collegamento con qualsiasi mezzo, ma questo sembra strano) se creo un test eseguibile che utilizza il mio pacchetto (nel campo build-depends), vuole collegarsi nello stesso. lib usato per compilare la libreria - anche se si tratta solo di chiamare le funzioni della libreria, non qualcosa che esponga il .lib. Ovviamente ha bisogno di accedere a .dll in fase di esecuzione, ma è normale. Anche il bisogno del .lib sembra strano.

Mi aspetto che il .lib sia già collegato al file .a generato da Cabal/GHC per la mia libreria al momento dell'installazione. Non è questo il caso? E se lo è, qualcuno può spiegare perché è così?

risposta

1

Sembra che si desideri il collegamento parziale (vedere la bandiera --relocatable nella pagina di manuale ld). Come posso vedere dalle fonti, cabal utilizza solo librerie di collegamento parziale, compilate per ghci. Da Distribution.Simple.GHC (buildLib funzione):

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 

si può vedere, che per la vaniglia e le librerie di profilatura, cabal invoca semplicemente ar utilità (vedi createArLibArchive). Per ghci chiama ld con il flag -r (che è una scorciatoia per --relocatable) (vedere combineObjectFiles).

Quindi, cabal non esegue alcun collegamento per le librerie vanilla, ma combina solo i file oggetto. In realtà cabal non può sapere, se l'applicazione finale utilizzerà qualsiasi simbolo dal tuo extra-lib, quindi il comportamento sembra ragionevole.

+0

C'è un modo per forzare l'uso di 'ld -r' invece di' ar' per le librerie di vanilla? Ho provato ad aggiungere 'ld-options: -r' ma non sembra fare nulla (presumibilmente perché' ld' non viene usato?) –

+0

@TomSavage No, penso che non sia possibile. Ma io non sono un esperto di cabala. – Yuras

Problemi correlati