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

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

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

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

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)
0
nl ja de

2 ответы

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

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

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

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

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

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

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

1
добавлено
кажется интересным :)
добавлено автор karim, источник
ИМХО это слишком много усилий: D - чистое решение, хотя
добавлено автор Daij-Djan, источник

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

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

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


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

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