У меня есть общий проект библиотеки, который разрабатывается из 4 статических библиотек (.a
) и один объект (.o
) файл. Я пытаюсь добавить -fvisibility=hidden
опция ограничить символы в выводе к только тем, которые я отмечаю в источнике с __ атрибут __.
Я добавил -fvisibility=hidden
опция к опциям компиляции для .so
проект (который покрывает .o
файл) и для .a
проекты.
Символы в объектном файле удалены как ожидалось из финала .so
. Однако символы от .a
проекты - все все еще в финале .so
файл. Добавление -fvisibility=hidden
опция к .so
команда ссылки не имеет никакого эффекта.
Что я делаю неправильно?
Моя цель здесь состоит в том, чтобы удалить из .so
все символы кроме функций интерфейса к библиотеке.
Править: Я на самом деле использовал карту версии для решения этого на данный момент. Однако это требует продолженного обслуживания сценария версии, когда внешние символы изменяются. Принятый ответ имеет лучшую идею.
Вы возвращаете ссылку на ret , которая является переменной в стеке.
-121--1127678-Проекты, зависящие друг от друга, не означают, что параллелизация невозможна. Системы сборки достаточно умны, чтобы понять и избежать критических депендаций. Иначе gcc не сможет использовать 4 ядра.
Поэтому (в дополнение к другим шагам), почему бы просто не попробовать включить многопроцессорную обработку в Visual Studio с помощью/MP (см. http://msdn.microsoft.com/en-us/library/bb385193.aspx ).
-121--1066995-В основном, видимость обрабатывается во время связывания, и компоновщик, похоже, не навязывает ее статическим архивам. Соответствующий вопрос (хотя и не дубликат) был задан на SO здесь .
Что я советовал бы, чтобы вы, чтобы сделать заменили свое соединение стадии: gcc - разделил-o mylib.so foo.o libbar.a
в два процесса стадий, куда вы возвращаете файлы объекта:
площадь x libbar.a
(возможно в подходящий, пустой справочник) gcc-fvisibility=hidden - разделил-o mylib.so foo.o tempdir / *.o