2011-09-22 1 views
5

Stavo lavorando con SFML, ho compilato un piccolo programma di test e aggiunto l'opzione di collegamento -lsfml-audio. Quindi, ho utilizzato ldd ./program per visualizzare le librerie dinamiche a cui si collegava. Sorprendentemente, ce n'erano molte, nessuna di esse era stata selezionata manualmente nel mio makefile, né usando pkg-config --libs.Collegamento delle dipendenze di una libreria condivisa

Ho iniziato a leggere le librerie condivise e ho fatto un piccolo esempio per risolvere i miei dubbi. Tuttavia, ho questa domanda:

il motivo per cui alcune librerie hanno bisogno di aggiungere le dipendenze nel makefile (manualmente o utilizzando uno script come pkg-config) ed altri librerie a collegamento automaticamente le loro dipendenze?

Quando si sta creando la libreria dinamica, è altrettanto facile come l'aggiunta la corretta -ldependency opzioni nel comando g++ -shared ... per evitare all'utente il fastidio di aggiungere manualmente le dipendenze in seguito. Perché molte delle librerie disponibili non lo fanno?

Suppongo che debba essere correlato alla capacità di sintonizzazione fine a cui le librerie vengono collegate e così via.

risposta

6

Le librerie condivise generalmente collegano nelle loro dipendenze. Tuttavia, le librerie statiche non sono in grado di farlo. pkg-config --libs spesso include tutte le dipendenze (dirette e indirette) in modo da poter passare alla compilazione statica semplicemente aggiungendo -static senza dover aggiungere ulteriori dipendenze di libreria.

Si noti che queste dipendenze dirette in eccesso sono considerate indesiderate in alcuni casi (ad esempio, debian tenta di evitarli in file binari pacchettizzati, in quanto rendono le transizioni del soname della libreria più traumatiche del necessario). Puoi chiedere al linker di rimuovere le dipendenze dirette dall'eseguibile finale che non sono necessarie con il flag -Wl,--as-needed.

+0

Penso di aver bisogno di fare alcune chiamate di nomi qui: le librerie condivise di solito non inseriscono le loro dipendenze (è 'libtool' quando vede un file' * .la'). Non è necessario includerli poiché il caricatore dinamico li calcolerà dall'intestazione '.NEEDED' nelle librerie condivise. Oltre ai problemi di overlinking che presenta 'libtool', anche la ricerca delle definizioni dei simboli al momento del collegamento può rallentare molto la costruzione. –

+0

@honk, Sì, libtool è una fonte di questi problemi. anche gli script pkg-config possono farlo. In ogni caso, non sono assolutamente necessari sulle piattaforme ELF: è necessario collegare solo ciò che si utilizza direttamente (anche se questo include qualsiasi cosa utilizzata tramite funzioni inline o macro) – bdonlan