Предыдущие ответы, касающиеся атрибута ((видимость («скрытый»))), хороши, если вы хотите сохранить код в долгосрочной перспективе, но если у вас есть только несколько символов, которые вы хотите видеть и хотеть быстрое исправление ... На символах, которые вы хотите использовать для экспорта, добавьте
__attribute__ ((visibility ("default")))
Тогда вы можете передать -fvisibility=hidden
компилятору
Здесь есть подробное объяснение:
http://gcc.gnu.org/wiki/Visibility
Редактировать: Альтернативой может быть создание статической библиотеки / архива (создайте .a архив с ar -cru mylib.a *.o
) или объединение объектов в один объектный файл в соответствии с этим объединение двух скомпилированных GCC объектных файлов .o в третий .o файл
Если вы спрашиваете "зачем объединять объектные файлы, а не просто создавать статическую библиотеку?" ... поскольку компоновщик будет обрабатывать файлы .o иначе, чем файлы .a (я не знаю почему, просто так), в частности, он позволит вам связать файл .o с общей библиотекой или двоичным файлом, даже если все символов скрыты (даже те, которые вы используете). Это дает дополнительное преимущество, заключающееся в сокращении времени запуска (на одно меньше DSO и намного меньше символов для поиска) и двоичного размера (символы обычно делают до ~ 20% от размера, а зачистка обеспечивает только половину этого - только видимые снаружи части)
для двоичных файлов strip --strip-all -R .note -R .comment mybinary
для библиотек strip --strip-unneeded -R .note -R .comment mylib.so
Подробнее о преимуществах статического связывания здесь: http://sta.li/faq, но они не обсуждают вопросы лицензирования, которые являются основной причиной , а не , чтобы использовать статическую библиотеку, и поскольку вы хотите скрыть Ваш API, это может быть проблемой
Теперь, когда мы знаем, что у нас есть объект, который является «чистым символом», мы можем использовать наш объединенный объект для создания libpublic.so, связав private.o и public.c (который псевдоним / экспортирует только то, что вы хотите public ) в общую библиотеку.
Этот метод хорошо подходит для поиска "лишнего кода", который также не нужен в вашем общедоступном API. Если вы добавите -fdata-sections -ffunction-sections
к вашим объектным сборкам, то при связывании с -Wl,--gc-sections,--print-gc-sections
это удалит неиспользуемые разделы и выведет вывод того, что было удалено.
Редактировать 2 - или вы можете скрыть весь API и псевдоним только те функции, которые вы хотите экспортировать
псевдоним ("цель")
Атрибут alias заставляет объявление отправляться как псевдоним для другого символа, который должен быть указан. Например,
void __f () { /* Do something. */; }
void f () __attribute__ ((weak, alias ("__f")));
определяет f' to be a weak alias for
__f '. В C ++ необходимо использовать искаженное имя для цели. Это ошибка, если `__f 'не определено в той же единице перевода.
Не все целевые машины поддерживают этот атрибут.