С++ -fvisibility = hidden -fvisibility-inlines-hidden
У меня есть вопрос о атрибуте видимости С++. Я прочитал http://gcc.gnu.org/wiki/Visibility, и все же я не совсем понимаю, как это работает.
Я хочу, чтобы видимость была скрыта в некоторых моих общих библиотеках, которые у меня есть. Я считаю, что это означает, что символы скрыты?
Как вы собираетесь связать общую библиотеку? Есть ли особый способ? Если я свяжу его, как он обычно связан, он не работает.
Может кто-нибудь мне помочь.
Ответы
Ответ 1
-fvisibility=hidden
делает все ваши символы скрытыми по умолчанию.
То, что вам нужно сделать, - выбрать, какие функции вы хотите видеть пользователям, связанным с вашей библиотекой, и сделать их видимыми, пометив их видимым атрибутом.
например.
void __attribute__((visibility("default"))) Exported()
{
// ...
}
Ответ 2
Это уменьшает сохранение ненужной информации о символах, которая является частной для общих объектов.
Рассмотрим общий объект, который содержит более 10 000 символов (функции/глобальные переменные), но только 100 из них являются публичными функциями, доступными из пользователей библиотеки. Мы можем сделать только 100 функций видимыми для других и оставшиеся 9 900 символов как частные.
Он также уменьшит размер общего объекта, так как в таблице перемещений будет отображаться только 100 символов. Использование этого флага вместе с -ffunction-sections -fdata-section приведет к уменьшению размера общего объекта путем определения, которое имеет отношение к этим 100 символам.