IPhone缺少所需的架构i386



我得到这个错误为我的一个项目使用静态库。项目在iOS设备上运行良好。但不是在模拟器中。这个静态库不是我的,所以我不能为i386重新编译它。但这是iPhone的硬件驱动程序。所以当在模拟器中运行时,我真的不需要这个库。就像如果配件出现在设备上,那么应用程序就会有不同的流程。

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

如何避免这个错误?在模拟器中运行时,是否有方法配置目标或方案以避免对象文件/库?

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)

当您使用它时,符号被引用并且需要lib。如果你真的不需要这个功能,把它的用法包装在一个定义中。'define it out':

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

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


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

即使您说您不需要模拟器中的库,链接器也会说别的。它正在寻找类iSmart

最好的方法可能是为类iSmart编写一个存根:
  • 创建一个静态库项目。

  • 添加一个非常非常小的类iSmart,例如类和两个方法。每个方法要么不做什么,要么返回0。

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

  • 使用lipo工具将第三方库和存根库的i386部分合并为一个库(导致大部分用于设备和非常小的部分用于模拟器)。

  • 链接你的应用与自定义构建的库,而不是原来的。

最新更新