differenza tra -h e -o opzioni in cc (C ++)
Domanda
Sto costruendo .so biblioteca e chiedevo - qual è la differenza b / w opzione cc compilatore -h e -o (utilizzando il Sun Studio C ++)?
Non stanno si riferiscono alla stessa cosa -? Il nome del file di output
Soluzione
-o
è il nome del file che verrà scritto su disco dal compilatore
-h
è il nome che verrà registrato in binari ELF che puntano contro questo file.
Un uso comune è quello di fornire i numeri di versione minore di libreria. Per esempio, se si sta creando il libfoo libreria condivisa, si potrebbe fare:
cc -o libfoo.so.1.0 -h libfoo.so.1 *.o
ln -s libfoo.so.1.0 libfoo.so.1
ln -s libfoo.so libfoo.so.1
Poi, se si compila il ciao App World e il collegamento contro di esso con il
cc -o hello -lfoo
il binario ELF per ciao registrerà una voce NEEDED
per libfoo.so.1
(che si può
vedi eseguendo elfdump -d hello
).
Poi, quando è necessario aggiungere nuove funzioni in seguito, è possibile modificare il valore di -o
libfoo.so.1.1
ma lasciare il -h a libfoo.so.1
- tutti i programmi che già costruito
con 1,0 ancora tentare di caricare libfoo.so.1
in fase di esecuzione, così continuare a lavorare senza essere
ricostruita, ma vedrete via ls che si tratta di 1.1.
Questa è talvolta usato per la costruzione di librerie nella stessa directory sono utilizzato in fase di esecuzione, se non si dispone di una directory di installazione separata o installare tramite un sistema di imballaggio. Per evitare di sbattere contro i programmi che sono in esecuzione quando si sovrascrivere il file binario biblioteca, e per evitare di programmi non essere in grado di iniziare a quando siete nel bel mezzo di costruzione, alcuni Makefile farà:
cc -o libfoo.so.1.new -h libfoo.so.1 *.o
rm libfoo.so.1 ; mv libfoo.so.1.new libfoo.so.1
(Makefiles costruite dal vecchio generatore makefile Imake da X comunemente fare questo.)
Altri suggerimenti
Si riferiscono a nomi diversi. In particolare, l'opzione -o
è del file reale nome - quello sul filesystem. L'opzione -h
imposta il interno DT_SONAME
nel file oggetto finale. Questo è il nome con cui l'oggetto condiviso viene fatto riferimento internamente da altri moduli. Credo che sia il nome che si vede anche quando si esegue ldd
su oggetti che puntano ad esso.
L'opzione -o sarà il nome del file di output, mentre l'opzione -h imposterà un nome intrinseca all'interno della libreria. Questo nome intrinseca ha la precedenza sul nome del file quando viene utilizzato dal caricatore dinamico e permette di utilizzare regole predefinite per sbirciare la libreria destra.
Si può vedere quale nome intrinseca è stato registrato in una data libreria con quel comando:
elfdump -d xxx.so | grep Soname
Date un'occhiata qui per i dettagli:
http://docs.oracle.com /cd/E23824_01/html/819-0690/chapter4-97194.html