2010-08-25 8 views
13

Ho una domanda sull'attributo di visibilità C++. Ho letto http://gcc.gnu.org/wiki/Visibility e ancora non capisco come funziona.C++ -fvisibility = hidden -fvisibility -inlines-hidden

Voglio usare la visibilità per essere nascosta su alcune delle mie librerie condivise che ho. Credo che questo significhi che i simboli sono nascosti?

Come si intende collegare quindi la libreria condivisa? C'è un modo speciale? Se collego come normalmente viene collegato, non funziona.

Qualcuno può aiutarmi per favore.

risposta

23

-fvisibility=hidden nasconde tutti i simboli per impostazione predefinita.

Quello che devi fare, è scegliere quali funzioni vuoi che siano visibili agli utenti che si collegano al tuo grimorio e renderle visibili contrassegnandole con un attributo visibile.

E.g.

void __attribute__((visibility("default"))) Exported() 
{ 
    // ... 
} 
+0

Grazie. Questo mi ha davvero aiutato. – nixgadgets

+2

E naturalmente vorrai creare una macro come "MYLIB_PUBLIC" o qualcosa di simile per renderla più pulita. –

3

Riduce il mantenimento di informazioni sui simboli non necessarie che sono private degli oggetti condivisi.

Si consideri un oggetto condiviso con più di 10.000 simboli (funzioni/variabili globali), ma solo 100 di questi erano funzioni pubbliche accessibili dagli utenti della libreria. Possiamo rendere le sole 100 funzioni visibili agli altri & rimanenti 9.900 simboli come privati.

Riduce anche le dimensioni dell'oggetto condiviso, poiché si tratta di una tabella di riposizionamento con solo 100 informazioni sui simboli. L'uso di questo flag insieme a -ffunction-sections -fdata-section ridurrà ulteriormente la dimensione dell'oggetto condiviso avendo la definizione che è rilevante per i 100 simboli.