2013-12-03 3 views
3

ПРОБЛЕМА: Связывание с моей библиотекой добавляет 2 МБ к двоичному.Добавление большой статической библиотеки в качестве cocoapod или непосредственно добавляет ВСЕ объектные файлы к результирующему двоичному из-за флагов -ObjC-линкера

Я пытаюсь распространять свою собственную статическую библиотеку на iOS. Моя библиотека зависит от модулей KSCrash и ProtobufObjc. Pods скомпилированы в своих собственных целях, а позже, когда статические libs (libabc.a) связаны с целевым приложением - это обычная процедура работы с cocoapods. Существует флаг '-ObjC', переданный компоновщику, который вызывает ВСЕ объектные файлы из KSCrash и Protobuf, которые вытягиваются в приведенное бинарное приложение. В моем коде есть файлы, содержащие только категории, поэтому я не могу удалить эти флаги без последствий. Вытягивание этих 2 libs добавляет до 1.5MB к приведенному размеру приложения. Если я свяжусь без добавленного размера «-ObjC», это примерно наполовину меньше, потому что флаг dead_stip, который, я полагаю, работает, только если нет флагов «-ObjC», «load_all» и т. Д.

Вопрос: Как я могу заставить «dead_strip» или какой-либо другой механизм работать, не теряя категории Objective-C?

Извещение 1: Я не могу позволить себе лишить символы, потому что мне нужна символика на устройстве.

уведомление 2: Регенерация протокола protobuf с флагом LITE не уменьшает размер, я думаю, что мне нужно использовать версию на C++, чтобы он работал.

ответ

2

Флаг-листок -force_load должен решить вашу проблему. Из Apple documentation:

-all_load заставляет компоновщик, чтобы загрузить все объектные файлы из каждой архивировать он видит, даже те, без кода Objective-C. -force_load - , доступный в Xcode 3.2 и более поздних версиях. Это позволяет контролировать зернистость . После каждого параметра -force_load должен следовать путь к архиву, и каждый объектный файл в этом архиве будет загружен.

Если вы правильно поняли вашу проблему, вам необходимо указать -force_load в архив вашей архивы, чтобы включить все категории. Я не совсем понимаю, почему вы можете жить, не загружая все из ваших зависимостей, но это может быть не очень важно, чтобы помочь ...

+0

Хорошо, давайте так выразиться: Я связываюсь с одной большой библиотекой. Эта библиотека содержит, помимо прочего, файлы только для категорий. Мне не нужны все классы библиотеки. Существует флаг dead_stip, который удаляет все неиспользуемые классы из моего приложения, но я также включаю -ObjC, чтобы принудительно загрузить все символы. В результате dead_strip не работает. –

+0

Можете ли вы далее описать, как структурирован проект? Является ли это ... а) App-Target напрямую связан с [libabc.a, KSCrash, ProtobufObjc] или b) ссылки приложения-цели на [libabc.a], и это связано с [KSCrash, ProtobufObjc] или совершенно другим? – hagi

+0

Если вы знакомы с CocoaPods - приложение зависит от некоторых cocoapods. Похоже, что в рабочем пространстве есть 2 проекта - приложение и Pods. Проект Pods создает статическую библиотеку для каждого модуля, от которого я зависим. После создания всех статических библиотек он объединяет их в одну большую статическую библиотеку. После слияния его проект приложения создает источники приложений, а затем ссылки на этот большой-все-pods-вместе libarary с включенным флагом -ObjC. –