Есть ли флаг компилятора, указывающий на отсутствие архитектуры armv7s?

С появлением iPhone 5 и других устройств armv7s возникают проблемы совместимости с существующими (закрытыми исходными) сторонними инфраструктурами, такими как Flurry, которые создаются без этой новой архитектуры.

Один из вариантов - подождать, пока они выпустят новую сборку, но я надеялся, что может быть флаг компилятора или что-то, что я могу использовать в своем проекте Xcode, который позволил бы компоновщику не знать, что архитектура armv7s из этой структуры и Вместо этого используйте armv7. Есть ли что-нибудь подобное?

Ответ 1

Невозможно загрузить фреймворк, который не включает целевую архитектуру.

Что вы можете сделать, так это только доставить приложение armv7 до обновления фреймворков. Приложение по-прежнему будет работать на iPhone 5, просто не используйте последнюю оптимизацию производительности, которую он предлагает.

Или, если бы вы могли жить без рамки на новой архитектуре, вы могли бы слабо связать ее. Но тогда вам нужно проверить свой код, если он загружен везде, где вы используете материал из фреймворка.

Ответ 2

Раньше был флаг компоновщика в GCC, allow_sub_type_mismatches, который позволил бы вам смешивать и сопоставлять версии архитектуры ARM в связанных библиотеках, но они, похоже, убрали это в последних версиях Xcode.

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

CEFAEDFE 0C000000 09000000

к

CEFAEDFE 0C000000 0B000000

Что вы в основном делаете, это изменить заголовок внутри каждого объекта кода, чтобы идентифицировать его как ARMv7, а не код ARMv7 - наборы команд обратно совместимы (или, похоже, так или иначе), поэтому он должен работать нормально даже с этим взломом, хотя я должен признать, что мы не будем знать этого наверняка, пока у нас не получится проверить его на iPhone 5.

В любом случае, как только вы изменили фреймворк, просто добавьте обе версии в свой проект и привяжите их к соответствующей архитектуре. Вы также можете создать новую единую структуру, используя lipo для объединения измененных и оригинальных библиотек.