我的一个项目使用静态库时收到此错误。该项目在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)
答案 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部分合并到一个库中(导致设备的很大一部分和非常小的部分用于仿真器)。
将您的应用与自定义构建的库而不是原始库相关联。