2015-01-22 8 views
10

Trovo che il flag -L deve essere dato quando si utilizza -rpath. Ad esempio:Perché è necessario -L quando si utilizza -rpath?

gcc -o test test.o -L. -lmylib -Wl,-rpath=. 

Perché è necessario il flag -L? Quali informazioni oltre alle informazioni dai file h sono necessarie al compilare il tempo?

Se rimuovo -L. Viene visualizzato il seguente messaggio:

gcc -o test test.o -lmylib -Wl,-rpath=. 
/usr/bin/ld: cannot find -lmyLib 

Tuttavia, è assolutamente corretto rimuovere entrambe le bandiere. Come questo:

gcc -o test test.o -lmylib 

A condizione che libmyLib può essere trovato in/usr/lib, che è. Perché non è necessario -L ora?

Questa è una domanda successiva a https://stackoverflow.com/a/8482308/1091780.

+0

Un linker non ha idea di cosa siano questi stupidi "file h". –

risposta

13

Anche le librerie dinamiche richiedono un grado di collegamento statico; il linker deve sapere quali simboli devono essere forniti dalla libreria dinamica. La differenza principale è che la libreria dinamica fornisce la definizione in fase di esecuzione, mentre con la libreria completamente statica fornisce la definizione al momento del collegamento.

Per questo motivo, è necessario specificare -L per specificare dove si trova il file da collegare, proprio come -l specifica la libreria specifica. . indica la directory corrente.

-rpath entra in gioco in fase di esecuzione, quando l'applicazione tenta di caricare la libreria dinamica. Informa il programma di una posizione aggiuntiva da cercare quando si tenta di caricare una libreria dinamica.

Il motivo -L/usr/lib non deve essere specificato perché il linker sta cercando lì per impostazione predefinita (poiché questo è un posto molto comune per mettere le librerie).

+0

Ancora non capisco che tipo di informazioni devono essere fornite al momento della compilazione. E guarda il mio ultimo esempio (ho aggiunto un esempio alla fine). Come mai queste informazioni sul tempo di costruzione non sono necessarie quando vengono rimossi entrambi i flag? –

+0

@FredrikJohansson fa questo aggiornamento? – OMGtechy

0

Un chiarimento della risposta di OMGtechy.

Se il linker non controlla quali simboli sono forniti da una libreria, non può mai dire se mancano alcuni simboli in fase di compilazione. Potrebbero trovarsi in una delle librerie caricate in fase di esecuzione. Non potresti mai sapere. Non esiste alcuna connessione in fase di compilazione tra i file di intestazione di una libreria e il file .so.