0

我的一个项目使用静态库时遇到此错误。该项目在 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)
4

2 回答 2

1

当您使用它时,将引用符号并且需要 lib。如果您真的不需要该功能,请将其用法包含在定义中。'定义它':

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

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


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

于 2012-12-28T10:18:00.317 回答
1

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

最好的方法可能是为类写一个存根iSmart

  • 创建一个静态库项目。

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

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

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

  • 将您的应用与自定义构建的库而不是原始库链接。

于 2012-12-28T10:23:48.607 回答