При создании статической библиотеки (как требуется для iOS) одна из проблем, с которой вы столкнетесь, заключается в том, как включить символы из категорий в эту библиотеку, чтобы они могли использоваться приложением.Флаг компоновщика -ObjC
должен содержать достаточно информации, чтобы включить категории в эти встроенные платформы, как Дейв Дрибин описывает в своей статье здесь .
Однако между iPhone OS 2.0 и 3.0 этоперестал работать правильно.Как я упоминал в этом ответе , мы столкнулись с этой проблемой в платформе Core Plot и обнаружили, что нам нужно добавить флаг компоновщика -all_load
, чтобы платформа работала правильно.Сами Apple опубликовала Технические вопросы и ответы QA1490 , в которых упоминается эта проблема:
Для 64-битных приложений и приложений для iPhone OS существует ошибка компоновщика, которая не позволяет -ObjC загружать файлы объектов из статических файлов.библиотеки, которые содержат только категории и не содержат классов.Обходной путь должен использовать флаги -all_load или -force_load.
-all_load заставляет компоновщик загружать все объектные файлы из каждого архива, который он видит, даже те, которые не содержат код Objective-C.-force_load доступен в Xcode 3.2 и позже.Это позволяет лучше контролировать загрузку архива.Каждый параметр -force_load должен сопровождаться путем к архиву, и каждый объектный файл в этом архиве будет загружен.
К сожалению, побочным эффектом этого является дублирование символов, связанных из нескольких библиотек.может вызвать ошибки, подобные тем, которые вы испытывали.
Я отправил отчет об ошибке по этому вопросу (еще в 2009 году), и похоже, что последняя версия LLVM, теперь используемая в XCode, больше не страдает от этой ошибки компоновщика.Я попытался использовать -ObjC
с целевой статической библиотекой Core Plot iOS, и теперь она работает нормально.Это долгожданная новость.