2010-08-25 3 views
13

У меня возник вопрос о атрибуте видимости C++. Я прочитал http://gcc.gnu.org/wiki/Visibility, и все же я не совсем понимаю, как это работает.C++ -fvisibility = hidden -fvisibility-inlines-hidden

Я хочу, чтобы видимость была скрыта в некоторых моих общих библиотеках, которые у меня есть. Я считаю, что это означает, что символы скрыты?

Как вы собираетесь связать общую библиотеку? Есть ли особый способ? Если я свяжу его, как он обычно связан, он не работает.

Может кто-нибудь мне помочь.

ответ

23

-fvisibility=hidden делает все ваши символы скрытыми по умолчанию.

Что вам нужно сделать, это выбрать, какие функции вы хотите видеть пользователям, связанным с вашей библиотекой, и сделать их видимыми, пометив их видимым атрибутом.

E.g.

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

Спасибо. Это действительно помогло. – nixgadgets

+2

И, естественно, вы захотите создать макрос вроде 'MYLIB_PUBLIC' или что-то подобное, чтобы сделать это чище. –

3

Это уменьшает хранение ненужной информации о символах, которая является частной для общих объектов.

Рассмотрите общий объект, который содержит более 10 000 символов (функции/глобальные переменные), но только 100 из них являются публичными функциями, доступными из пользователей библиотеки. Мы можем сделать только 100 функций видимыми для других &, оставаясь 9,900 символов как приватных.

Он также уменьшит размер совместно используемого объекта, поскольку в таблице перемещений будет отображаться только 100 символов. С помощью этого флага вместе с -function-sections -fdata-section уменьшит размер общего объекта, указав определение, соответствующее 100 символам.

Смежные вопросы