Подтвердить что ты не робот

Извлечь объекты (*.o) из статической библиотеки iPhone

У меня есть набор статических библиотек 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? Это может потенциально уменьшить конечный размер файла.

4b9b3361

Ответ 1

Это потому, что ваш 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), если ему нужно разрешить некоторую ссылку на символ. Поэтому, если библиотека содержит объектный файл, символы которого никогда не ссылаются во время процесса связывания (т.е. Символы, которые не используются эффективно), этот объектный файл не превратит его в исполняемый файл.

Ответ 2

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

Code: ar -xv mylib.a myobj.o Это извлечет объект, который даст myobj.o из библиотеки mylib.a.