2010-08-25 16 views
13

Ich habe eine Frage über das C++ Sichtbarkeitsattribut. Ich habe http://gcc.gnu.org/wiki/Visibility gelesen und doch verstehe ich nicht ganz, wie es funktioniert.C++ -visibility = versteckt -visibility-inlines-hidden

Ich möchte die Sichtbarkeit auf einige meiner freigegebenen Bibliotheken, die ich habe, zu verbergen. Ich glaube, das bedeutet, dass die Symbole versteckt sind?

Wie soll die Shared Library dann verlinkt werden? Gibt es einen besonderen Weg? Wenn ich es verlinke, wie es normalerweise verbunden wird, funktioniert es nicht.

Kann mir bitte jemand helfen.

Antwort

23

-fvisibility=hidden macht alle Ihre Symbole ausgeblendet standardmäßig.

Was Sie dann tun müssen, ist auszuwählen, welche Funktionen für Benutzer sichtbar sein sollen, die sich mit Ihrer Bibliothek verbinden und sie sichtbar machen, indem Sie sie mit einem sichtbaren Attribut markieren.

z.

+0

Danke. Das hat wirklich geholfen. – nixgadgets

+2

Und natürlich wollen Sie ein Makro wie 'MYLIB_PUBLIC' oder etwas Ähnliches erstellen, um das zu säubern. –

3

Es reduziert die Aufbewahrung unnötiger Symbolinformationen, die für Shared Objects privat sind.

Betrachten Sie ein gemeinsames Objekt mit mehr als 10.000 Symbolen (Funktionen/globale Variablen), aber nur 100 davon waren öffentliche Funktionen, auf die Bibliotheksbenutzer zugreifen können. Wir können die einzigen 100 Funktionen als sichtbar für andere & verbleibenden 9.900 Symbole als private machen.

Es verringert auch die Größe des gemeinsamen Objekts, da es sich bei einer Verschiebungstabelle nur um 100 Symbolinformationen handelt. Wenn Sie dieses Flag zusammen mit -ffunction-sections -fdata-section verwenden, wird die Größe des gemeinsamen Objekts weiter reduziert, indem Sie die Definition erhalten, die für diese 100 Symbole relevant ist.

Verwandte Themen