Почему -force_load больше не требуется для моих трех20 зависимостей в XCode 4.2? - PullRequest
7 голосов
/ 30 октября 2011

У меня есть проект с зависимостью от сторонней статической библиотеки и трех20 библиотек. В XCode 3.X для компиляции моего проекта мне пришлось использовать флаг -force_load в настройке сборки «Другие флаги компоновщика» и указать каждую из трех20 библиотек, которые я хотел включить.

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

Мой проект теперь успешно строится.

Интересно, может кто-нибудь объяснить мне, почему это изменение сработало? Была ли ошибка, исправленная в XCode 4.2, или это изменение поведения? В этом посте предполагается, что была ошибка в XCode 3.2, но было бы замечательно, если бы кто-то мог пролить дополнительный свет на эту тему для меня, поэтому я могу быть уверен, что, возможно, я не сделал что-то неправильно, удалив эти флаги force_load.

Спасибо!

1 Ответ

19 голосов
/ 30 октября 2011

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

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