в iphone отсутствует необходимая архитектура i386

Я получаю эту ошибку для одного из моих проектов, использующих статическую библиотеку. Проект хорошо работает на устройстве iOS. Но не в симуляторе. Статическая библиотека не моя, поэтому я не могу ее перекомпилировать для i386. Но это аппаратный драйвер для iPhone. Так что при работе в Симуляторе мне действительно не нужна эта библиотека. Это похоже на то, что если аксессуар присутствует на устройстве, тогда приложение будет иметь другой поток.

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

Как я могу избежать этой ошибки? Есть ли способ настроить цель или схему, чтобы избежать объектного файла/библиотеки при работе в симуляторе?

ld: warning: ignoring file 
/Framework/iSmartSDK/libiSmartSDK_Lib.a, missing required architecture i386 in file  
/Framework/iSmartSDK/libiSmartSDK_Lib.a (2 slices)
Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_iSmart", referenced from:
      objc-class-ref in SmartCardReaderVC.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

person karim    schedule 28.12.2012    source источник


Ответы (2)


когда вы его используете, на символ ссылаются и требуется библиотека. если вам действительно не нужна эта функциональность, оберните ее использование в файле define. «определить это»:

#if TARGET_OS_IPHONE
   iSmart *smart = ....
#else
   NSLog(@"no ismart on mac");
#endif

ПРИМЕЧАНИЕ. Недостаточно не назначать/вызывать символ. даже не используйте символ для объявления переменной**


Это может быть только в 1 файле AFAICS .. #ifdef весь файл и, возможно, создать заглушку SmartReaderVC

person Daij-Djan    schedule 28.12.2012
comment
Тогда мне нужно иметь много определений # в моем коде, что сделает его беспорядочным. Есть ли другой способ, например, объявить «слабый» ссылочный тип или «необязательную» библиотеку? - person karim; 28.12.2012
comment
IIRC не для статических библиотек, нет. для динамических библиотек и фреймворков, но не для файлов .a - person Daij-Djan; 28.12.2012
comment
это только в 1 файле AFAICS .. #ifdef весь файл и, возможно, создать заглушку SmartReaderVC - person Daij-Djan; 28.12.2012

Даже если вы говорите, что вам не нужна библиотека в эмуляторе, компоновщик говорит что-то другое. Он ищет класс iSmart.

Лучший путь вперед, вероятно, написать заглушку для класса iSmart:

  • Создайте проект статической библиотеки.

  • Добавьте очень, очень минимальный класс iSmart, например. класс и два метода. Каждый метод либо ничего не делает, либо возвращает 0.

  • Соберите библиотеку для эмулятора (i386).

  • Используйте инструмент lipo, чтобы объединить библиотеку из сторонней и части i386 вашей библиотеки-заглушки в единую библиотеку (в результате получается большая часть для устройства и очень минимальная часть для эмулятора).

  • Свяжите свое приложение с пользовательской библиотекой вместо оригинальной.

person Codo    schedule 28.12.2012
comment
ИМХО, это слишком много усилий: D - хотя самое чистое решение - person Daij-Djan; 28.12.2012