2012-03-31 5 views
21

Perché è che alcune librerie statiche (lib * .a) possono essere collegati allo stesso modo che le librerie condivise (lib * .so) sono collegati (ld -l interruttore), ma alcuni non possono?modo corretto di collegare una libreria statica utilizzando GCC

avevo sempre stato insegnato che tutte le librerie statiche, o meno, possono essere collegati con -l ... però ho incontrato una libreria finora (GLFW), che non fa altro che vomitare "undefined reference" collegare gli errori se provo a collegarlo in questo modo.

In base alla risposta su this question, il modo "corretto" per collegare le librerie statiche è includerle direttamente, insieme ai miei file oggetto, piuttosto che usare -l. E, nel caso della biblioteca GLFW, questo risolve certamente il problema. Ma ogni altra libreria statica che sto usando funziona bene quando è collegata a -l.

Quindi:

  • Che cosa ha potuto causare questo una libreria a non funzionare quando è legato piuttosto che direttamente incluso? Se conoscessi la causa, forse potrei modificare e ricompilare la libreria per risolvere il problema.
  • È vero che non si suppone che si colleghino librerie statiche nello stesso modo in cui si collegano le librerie condivise? (E se no, perché no?)
  • È il linker ancora in grado di eliminare le funzioni di libreria non utilizzate dal l'eseguibile di uscita quando la libreria è direttamente incluso in questo modo?

risposta

25

Grazie per le risposte! Risulta che il problema era dovuto all'ordine di collegamento. Apparentemente, se si utilizza una libreria che a sua volta ha altre dipendenze della libreria, le altre dipendenze devono essere elencate dopo la libreria, non prima come stavo facendo. Ho imparato qualcosa di nuovo!

5

Ti è piaciuto indicare a GCC il percorso della libreria (utilizzando -L)? Usando solo l, GCC sarà in grado di collegare solo le librerie disponibili nelle directory standard.

-L[path] -l[lib] 
+0

Sì, i percorsi per ogni libreria vengono forniti utilizzando -L, prima del flag -l corrispondente. GCC può trovare la libreria, ma fornisce un numero elevato di errori di riferimento non definiti all'interno della libreria. – Nairou

1

Il motivo è storico. Lo strumento "ar" era originale lo strumento di archiviazione di file su unix PDP11, anche se è stato successivamente sostituito interamente da "tar" a tale scopo. Memorizza i file (file oggetto, in questo caso) in un pacchetto. E c'è un'estensione separata contenente la tabella dei simboli per il linker da utilizzare. È possibile che se si gestiscono manualmente i file nell'archivio la tabella dei simboli non può essere aggiornata.

La risposta breve è che è possibile utilizzare lo strumento "ranlib" su qualsiasi archivio per ricreare la tabella dei simboli. Prova questo. Più in generale, cerca di capire da dove provengono le librerie corrotte e risolverlo.

+2

Penso che l'OP significhi link * contro * una libreria, non creare una libreria. – ams

5

Il modo corretto per collegare una libreria statica sta usando -l, ma che funziona solo se la libreria può essere trovato nel percorso di ricerca. Se non lo è, puoi aggiungere la directory all'elenco usando -L o nominare il file per nome, come dici tu.

Lo stesso vale per le librerie condivise, in realtà, anche se sono più probabilità di essere trovati, forse.