2011-10-20 16 views
11

Dire che ho libA. Dipende ad esempio da libSomething per il semplice fatto che un metodo non in linea di libA effettua una chiamata a un metodo in libSomething.h. Come si collega la dipendenza in questo caso? LibA deve collegare staticamente a libSomething quando viene compilato, oppure un utente di libA (un'applicazione che usa libA) deve collegarsi sia a libA che a libSomething?Come si collegano le librerie statiche alle dipendenze?

Grazie

risposta

14

linking statico semplicemente copiando gli elementi interi (funzioni, costanti, ecc) nella eseguibile risultante. Se il codice di una libreria statica contiene riferimenti ad alcuni elementi della libreria condivisa, questi riferimenti diventeranno delle dipendenze nell'eseguibile risultante. Lo stesso vale se colleghi una libreria anziché un eseguibile.

This thread discute come succede in Linux.

+0

Se non desidero che l'eseguibile risultante abbia l'onere, cosa posso fare? – jmasterx

+1

@Milo: è possibile collegare le librerie statiche delle dipendenze di libSomthing in libA. –

+0

@Milo: non si desidera alcuna dipendenza condivisa? Quindi devi solo collegare tutto staticamente, usando solo le librerie statiche. Ciò si tradurrà in un grande eseguibile autonomo senza dipendenze. Ma attenzione, è difficile costruire alcune librerie come quelle statiche. – vines

4

Durante il processo di compilazione il compilatore traduce il codice in un formato temporaneo, chiamiamolo un file oggetto. Nel file oggetto c'è una lista di simboli che il compilatore non è in grado di risolvere, di solito definizioni altrove. La fase di collegamento è incaricata di risolvere questi simboli.

Il processo di compilazione invia i file al linker fino a quando tutti i simboli sono stati risolti. Non ci sono liste di dipendenze fisiche, solo elenchi di simboli da risolvere. Ciò consente di risolvere i simboli utilizzando librerie diverse. Ad esempio, si potrebbe voler utilizzare una libreria Windows per problemi specifici di Windows; una libreria linux per problemi specifici di Linux. Questo non afferma esplicitamente che un programma dipende da una libreria di Windows; potrebbe anche dipendere da quello di Linux.

Alcuni compilatori possono generare elenchi di dipendenze, in genere per l'utilizzo in un processo di compilazione. Tuttavia, la responsabilità ultima spetta al programmatore.

6

Una libreria statica è più o meno un semplice archivio di file di oggetti binari scollegati (* .o o * .obj), durante la compilazione dell'archivio, non viene effettuato alcun controllo per le dipendenze. Quando si collega il proprio eseguibile binario (o libreria condivisa/DLL), il linker verifica tutte le dipendenze necessarie e solo in tal caso ti avviserà di eventuali problemi.

Problemi correlati