2010-08-25 8 views
13

Mam pytanie dotyczące atrybutu widoczności C++. Przeczytałem http://gcc.gnu.org/wiki/Visibility, a jednak nie bardzo rozumiem, jak to działa.C++ -fvisibility = hidden -fvisibility-inlines-hidden

Chcę, aby widoczność była ukryta w niektórych moich udostępnionych bibliotekach, które mam. Wierzę, że oznacza to, że symbole są ukryte?

W jaki sposób masz połączyć bibliotekę współdzieloną? Czy jest jakiś specjalny sposób? Jeśli połączę to, jak zwykle jest połączony, to nie działa.

Czy ktoś może mi pomóc proszę.

Odpowiedz

23

-fvisibility=hidden powoduje, że wszystkie symbole są ukryte domyślnie.

Następnie należy wybrać funkcje, które mają być widoczne dla użytkowników łączących się z biblioteką i uczynić je widocznymi, zaznaczając je widocznym atrybutem.

E.g.

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

Dzięki. To naprawdę pomogło. – nixgadgets

+2

Naturalnie będziesz chciał utworzyć makro takie jak 'MYLIB_PUBLIC' lub coś podobnego, aby uczynić to czystszym. –

3

Ogranicza przechowywanie niepotrzebnych informacji o symbolu, które są prywatne dla obiektów wspólnych.

Rozważ obiekt współdzielony, który ma więcej niż 10 000 symboli (funkcje/zmienne globalne), ale tylko 100 z nich było funkcjami publicznymi dostępnymi dla użytkowników biblioteki. Możemy uczynić jedyne 100 funkcji widocznymi dla innych jako pozostałe 9 900 symboli jako prywatne.

Spowoduje to również zmniejszenie rozmiaru obiektu współdzielonego, ponieważ jest to tabela relokacji zawierająca tylko 100 informacji o symbolu. Używanie tej flagi wraz z -funkcja-sekcji -fdata-sekcja spowoduje dalsze zmniejszenie rozmiaru obiektu współużytkowanego dzięki definicji istotnej dla tych 100 symboli.

Powiązane problemy