Не выставляйте символы из используемой библиотеки в собственную статическую библиотеку - PullRequest
14 голосов
/ 21 октября 2009

Я пишу статическую библиотеку многократного использования для iPhone, следуя указаниям здесь .

Я хочу использовать minizip в своей библиотеке для внутренних целей, но не хочу показывать ее пользователю.

Пользователь должен иметь возможность самостоятельно включать мини-архив, возможно, другую версию, и не вызывать столкновения с моей "внутренней" версией мини-файла.

Возможно ли это?

Изменить:

Я пытался добавить -fvisibility=hidden к дополнительным флагам компилятора для мини-файлов и изменить функции на __private_extern__ и __attribute__((visibility("hidden"))), но, похоже, он по-прежнему создает определенные внешние символы:

00000918 T _unzOpen
0000058e T _unzOpen2
00001d06 T _unzOpenCurrentFile
00001d6b T _unzOpenCurrentFile2
...

Редактировать # 2:

Очевидно, что символы, помеченные этими аннотациями, становятся частными только для компоновщика, что никогда не происходит, когда XCode создает источники, поскольку он добавляет параметр -c («Компилировать или собирать исходные файлы, но не создавать ссылки».)

Ответы [ 2 ]

10 голосов
/ 05 ноября 2009

Вы можете переименовать все экспортируемые символы из minizip с помощью objcopy.

что-то вроде

objcopy -redefine-sym=minizip.syms yourstaticlibray.a 

и minizip.syms

_unzOpen     _yourownprefix_unzOpen
_unzOpen2    _yourownprefix_unzOpen2
...          ...

Никаких конфликтов, если исполняемый файл связан с другими minizip.a и yourstaticlibray.a, и поскольку вы переименовали все символы в yourstaticlibray.a, ваш вызов внутри yourstaticlibray.a в minizip будет использовать префиксный символ, а не unzOpen один.

4 голосов
/ 16 ноября 2009

Поскольку статическая библиотека - это не что иное, как набор файлов .o (которые еще не связаны, как вы уже упоминали), единственный способ полностью скрыть присутствие minizip от внешнего мира - это каким-то образом скомпилировать minizip и вашу библиотеку. вместе как единое целое и делают статические функции / переменные минизипа

.

Вы можете посмотреть, как SQLite выполняет процесс "объединения", который превращает исходный код библиотеки в один файл .c для дальнейшей компиляции: Объединение SQLite .

В качестве бонуса вы получите лучшую оптимизацию (действительно, недавно GCC и Binutils могут оптимизировать время соединения, но эта функциональность еще не выпущена).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...