C ++ -fvisibility = скрытый -fvisibility-inlines-hidden - PullRequest
17 голосов
/ 26 августа 2010

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

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

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

Может кто-нибудь помочь мне, пожалуйста.

Ответы [ 2 ]

30 голосов
/ 26 августа 2010

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

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

Например,

void __attribute__((visibility("default"))) Exported()
{
    // ...
}
4 голосов
/ 21 января 2013

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

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

Это также уменьшит размер разделяемого объекта, потому что это таблица перемещения будет иметь только 100 символов информации.Использование этого флага вместе с -ffunction-section -fdata-section еще больше уменьшит размер общего объекта, имея определение, относящееся к этим 100 символам.

...