Извлечение файлов объектов (* .o) из статической библиотеки iPhone - PullRequest
28 голосов
/ 02 января 2011

У меня есть набор статических библиотек iPhone (файл * .a), из которых я вызываю только несколько классов. В прошлом я использовал AR (с библиотеками linux) для извлечения объектных файлов из статической библиотеки, удаления ненужных объектных файлов и повторного архивирования.

Однако, когда я пытаюсь сделать это с помощью статической библиотеки, скомпилированной на iPhone, я получаю следующую ошибку:

ar: CustomiPhoneLib.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
ar: CustomiPhoneLib.a: Inappropriate file type or format

Кто-нибудь знает, как извлечь объектные файлы из скомпилированной статической библиотеки iphone? Это может уменьшить окончательный размер файла.

Ответы [ 2 ]

42 голосов
/ 02 января 2011

Это потому, что ваш CustomiPhoneLib.a является толстой библиотекой, то есть библиотекой, которая содержит более одной целевой архитектуры, а именно armv6 и armv7 на iOS.Вы можете использовать lipo для извлечения конкретной архитектуры в другой файл .a, используйте ar и ranlib для манипулирования им по желанию, а затем снова используйте lipo, чтобы объединить манипулированные файлы .a в один .aтолстый файл.Например,

lipo CustomiPhoneLib.a -thin armv6 -output CustomiPhoneLibarmv6.a
lipo CustomiPhoneLib.a -thin armv7 -output CustomiPhoneLibarmv7.a
### use ar and ranlib at will on both files
mv CustomiPhoneLib.a CustomiPhoneLib.a.original
lipo CustomiPhoneLibarmv6.a CustomiPhoneLibarmv7.a -create -output CustomiPhoneLib.a

Однако вам не нужно делать это по той причине, которую вы упомянули.Компоновщик извлекает файлы объектов (.o) из библиотеки (.a) только в том случае, если ему необходимо разрешить некоторую ссылку на символ.Следовательно, если библиотека содержит объектный файл, на символы которого никогда не ссылаются в процессе компоновки (т. Е. Символы, которые не используются эффективно), этот объектный файл не попадет в исполняемый файл.

4 голосов
/ 21 февраля 2014

Code: ar -t mylib.a Это перечислит все файлы в архиве.

Code: ar -xv mylib.a myobj.o Это позволит извлечь объект myobj.o из библиотеки mylib.a.

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