iphone缺少必需的架构i386

时间:2012-12-28 10:12:59

标签: iphone linker i386 iphone-accessory

我的一个项目使用静态库时收到此错误。该项目在iOS设备中运行良好。但不是在模拟器中。静态库不是我的,所以我不能为i386重新编译它。 但这是iPhone的硬件驱动程序。因此,当在Simulator中运行时,我真的不需要这个库。如果配件与设备一起存在,那么应用程序将具有不同的流程。

所以我必须保留对此文件的引用。但只需要iOS设备。在模拟器中运行以运行应用程序以进行UI和其他测试时不需要。

如何避免此错误?无论如何配置目标或方案以避免在模拟器中运行时的目标文件/ 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)

2 个答案:

答案 0 :(得分:1)

使用它时,引用符号IS并且需要lib。如果你真的不需要这个功能,请将它的用法包装在一个define中。 '定义':

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

注意:不指定/调用符号是不够的。甚至不使用符号来声明变量**


它可能只在1文件AFAICS .. #ifdef整个文件,也许创建一个SmartReaderVC存根

答案 1 :(得分:1)

即使您说您不需要模拟器中的库,链接器也会说其他内容。它正在寻找班级iSmart

最好的方法可能是为班级iSmart编写一个存根:

  • 创建一个静态库项目。

  • 添加一个非常非常小的课程iSmart,例如这个类和两个方法。每种方法都不做任何事情或返回0。

  • 为模拟器(i386)构建库。

  • 使用lipo工具将来自第三方的库和存根库的i386部分合并到一个库中(导致设备的很大一部分和非常小的部分用于仿真器)。

  • 将您的应用与自定义构建的库而不是原始库相关联。