Условная компиляция для armv6 и armv7

У меня есть опубликованное приложение, которое поддерживает как amrv6, так и armv7. Теперь у меня есть обновление, совместимое только с armv7 (я добавил внешнюю библиотеку, которая зависит от armv7). Когда я пытаюсь отправить приложение в магазин, я получаю сообщение об ошибке, подробно описано в

Я понимаю предыдущую ошибку, и мне нужно изменить мое приложение, чтобы оно поддерживало обе архитектуры. Моя проблема в том, что мой код зависит от библиотеки, совместимой только с armv7. Если я изменю свойства своего проекта для поддержки как armv6, так и armv7, я получаю ошибку компиляции (подробности ниже). Мне нужно иметь возможность скомпилировать код с поддержкой обеих архитектур: armv7 компилируется с использованием библиотеки, от которой я зависим. В armv6 есть другой код, не зависящий от библиотеки.

Как я могу этого добиться?

Детали ошибки:

• the compile crash is in one Lib file (.a) and the error says : ld: warning: directory not found for option '-L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib/gcc/arm-apple-darwin10/4.0.1' ld: in /Users/.../(lib file).a, file is universal but does not contain a(n) armv6 slice for architecture armv6 Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2 failed with exit code 1

заранее спасибо


person silvaric    schedule 07.03.2012    source источник
comment
Возможно, вы захотите пометить свой вопрос с помощью iOS и xcode. Это больше вопрос о том, как создавать универсальные двоичные файлы с помощью этой инструментальной цепочки, чем о развертывании вашего собственного диспетчера, зависящего от архитектуры, в сборке ARM.   -  person Z.T.    schedule 07.03.2012


Ответы (6)


Что ж, я понял, что мой последний ответ неправильный ... Apple сказала, что это невозможно, но это не совсем так ... благодаря Джим, я поискал еще немного и нашел способ сделать это ..

  1. Удалите библиотеку из "этапов сборки"
  2. Добавьте обе архитектуры в «Другие флаги компоновщика» (настройки сборки), для этого вам нужно щелкнуть + и добавить armv6 и armv7
  3. Добавьте библиотеку в armv7 .. с -l
  4. Не забывайте #if defined _ARM_ARCH_7 в своем коде

Это похоже на ответ Джима, но более подробно.

person silvaric    schedule 15.03.2012

Я получил такой ответ от Apple:

Вы не можете условно создать свое приложение ни для armv6, ни для armv7. Ваша статическая библиотека должна быть создана как для armv6, так и для armv7, поскольку ваше приложение поддерживает обе эти архитектуры ... Вы можете отказаться от поддержки armv6, установив для цели развертывания iOS значение 4.3 или выше.

В основном мне нужно попросить разработчика библиотеки построить для обеих архитектур (= /), или я установил минимальную цель на 4.3 и только для armv7

person silvaric    schedule 09.03.2012

При наведении курсора на параметр в настройках сборки появляется +, который можно щелкнуть, чтобы привязать параметр к определенной архитектуре. Вам нужно будет удалить библиотеку из обычного списка библиотек и добавить ее, передав аргумент -L вручную только для armv7. Вероятно, вам также придется добавить определение препроцессора, чтобы вы могли поместить #ifdefs вокруг кода, вызывающего библиотеку.

Изменить: подумав, вы могли бы сделать это более простым способом, отметив библиотеку как необязательную в разделе этапов сборки.

person Jim    schedule 07.03.2012
comment
Спасибо! но я не понимаю, где / что удалить библиотеку из обычного списка библиотек, я изменил пути поиска библиотек и другие флаги компоновщика, с помощью + я создаю две строки с armv6 и armv7. Но теперь у меня новая ошибка, и в деталях говорится .. not found l (lib) .a .. что-то вызывает Lib .. я удаляю все доказательства в коде, а также необязательно в разделе этапов сборки ... так что, вероятно, мне нужно удалите его в нормальном списке, как вы сказали. - person silvaric; 08.03.2012
comment
Я дал вам две альтернативы. Не стоит пытаться делать и то, и другое одновременно. - person Jim; 08.03.2012

Извините, я вставил не ту вещь из буфера обмена.

Я хотел сказать:

Просто удалите плохую архитектуру из Valid Architectures в Target Aguilar Settings, и все готово :)

person marciokoko    schedule 13.09.2012

У меня была та же проблема, поэтому я переключил: "Build Activate Architecture Only" на "Да" (в Target -> Build Settings)

Это работает ... пока.

Я предполагаю, что мое приложение не будет работать на iPhone 5, но мне придется подождать, пока поставщик статической библиотеки, которую я использую, не соберет его для armv7 / armv7s

person vedran    schedule 17.09.2012

У меня была эта проблема с SDK Google Analytics для iOS. Простая замена библиотеки на последнюю версию - вот что решило для меня эту проблему.

person Stunner    schedule 26.12.2012