在ios开发中,经常会导入一些三方的sdk,有些正规的sdk的开发者支持了模拟器,但也有很多是不支持的,这就很令人头疼了。因为随着苹果产品的不断迭代更新,每年都会有新的手机设备出现,而这时作为开发者的我们都给痛苦一阵,不仅要熟悉新的xcode带来的变化,有用的变化还好,又时候xcode的升级还隐藏了很多坑;接下来,就要做新设备的适配了,如果新设备的尺寸没变那还好说,要是有新的分辨率的新设备出现,一定要每个页面都翻看下,即时解决新版本适配问题。但是新出的设备价格高而且不一定买得到,那我们只能用模拟器来适配了。所有让自己的工程支持模拟器是非常有必要的。
我们的工程在前人开发的时候,有部分sdk是不支持模拟器的,只能亲配了。
1、模拟器运行,cmd+r报错如下:
Undefined symbols for architecture x86_64:
"easr_engine::WakeUpDecode(short*, int, char**, int, bool)", referenced from:
BDS_ASR::InterfaceSync::DNNWakeUpDecode(short*, int, char**, int, bool) in libBaiduSpeechSDK.a(InterfaceSync.o)
"easr_engine::WakeUpReset()", referenced from:
BDS_ASR::InterfaceSync::DNNWakeUpReset() in libBaiduSpeechSDK.a(InterfaceSync.o)
"easr_engine::WakeUpFree()", referenced from:
BDS_ASR::InterfaceSync::DNNWakeUpFree() in libBaiduSpeechSDK.a(InterfaceSync.o)
"easr_engine::WakeUpInitial(char const*, char const*, int)", referenced from:
BDS_ASR::InterfaceSync::DNNWakeUpInitial(char const*, char const*, int) in libBaiduSpeechSDK.a(InterfaceSync.o)
"_OBJC_METACLASS_$_EasyARScene", referenced from:
_OBJC_METACLASS_$_EasyARSceneView in EasyARSceneView.o
(maybe you meant: _OBJC_METACLASS_$_EasyARSceneView)
"_OBJC_METACLASS_$_EasyARSceneController", referenced from:
_OBJC_METACLASS_$_ViewControllerAR in ViewControllerAR.o
"_OBJC_CLASS_$_EasyARSceneController", referenced from:
_OBJC_CLASS_$_ViewControllerAR in ViewControllerAR.o
"_OBJC_CLASS_$_UAFClient", referenced from:
objc-class-ref in RouterManage+TransactionVerifyConfig.o
objc-class-ref in UserCenter.o
objc-class-ref in SecurityManagerViewController.o
objc-class-ref in TouchIDView.o
objc-class-ref in CashierNetWorkTools.o
"_OBJC_CLASS_$_EasyAR3D", referenced from:
objc-class-ref in AppDelegate.o
"_OBJC_CLASS_$_SHDFServerSDK", referenced from:
objc-class-ref in AppDelegate.o
"_OBJC_CLASS_$_EasyARScene", referenced from:
objc-class-ref in AppDelegate.o
_OBJC_CLASS_$_EasyARSceneView in EasyARSceneView.o
(maybe you meant: _OBJC_CLASS_$_EasyARSceneView)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
不支持模拟器的速度快主要有:
libBaiduSpeechSDK
EasyAR SDK
SHDFsdk
FTUAFClientSDK
及其调用到这些sdkd代码。
先拿libBaiduSpeechSDK来说,用lipo -info命令查看其支持的cpu类型显示是支持x86_64及i386的,于是将工程中的valid Architectures修改为armv7 armv7s,把Build Active Architecture Only设为no,cmb+b报错:
Undefined symbols for architecture i386:
"easr_engine::WakeUpDecode(short*, int, char**, int, bool)", referenced from:
BDS_ASR::InterfaceSync::DNNWakeUpDecode(short*, int, char**, int, bool) in libBaiduSpeechSDK.a(InterfaceSync.o)
"easr_engine::WakeUpReset()", referenced from:
BDS_ASR::InterfaceSync::DNNWakeUpReset() in libBaiduSpeechSDK.a(InterfaceSync.o)
"easr_engine::WakeUpInitial(char const*, char const*, int)", referenced from:
BDS_ASR::InterfaceSync::DNNWakeUpInitial(char const*, char const*, int) in libBaiduSpeechSDK.a(InterfaceSync.o)
"_OBJC_METACLASS_$_EasyARScene", referenced from:
_OBJC_METACLASS_$_EasyARSceneView in EasyARSceneView.o
(maybe you meant: _OBJC_METACLASS_$_EasyARSceneView)
"easr_engine::WakeUpFree()", referenced from:
BDS_ASR::InterfaceSync::DNNWakeUpFree() in libBaiduSpeechSDK.a(InterfaceSync.o)
"_OBJC_METACLASS_$_EasyARSceneController", referenced from:
_OBJC_METACLASS_$_ViewControllerAR in ViewControllerAR.o
"_OBJC_CLASS_$_EasyARSceneController", referenced from:
_OBJC_CLASS_$_ViewControllerAR in ViewControllerAR.o
"_OBJC_CLASS_$_BaiduOAuthSDK", referenced from:
objc-class-ref in BaiduManager.o
"_OBJC_CLASS_$_UAFClient", referenced from:
objc-class-ref in RouterManage+TransactionVerifyConfig.o
objc-class-ref in UserCenter.o
objc-class-ref in SecurityManagerViewController.o
objc-class-ref in TouchIDView.o
objc-class-ref in CashierNetWorkTools.o
"_OBJC_CLASS_$_EasyAR3D", referenced from:
objc-class-ref in AppDelegate.o
"_OBJC_CLASS_$_SHDFServerSDK", referenced from:
objc-class-ref in AppDelegate.o
"_OBJC_CLASS_$_EasyARScene", referenced from:
objc-class-ref in AppDelegate.o
_OBJC_CLASS_$_EasyARSceneView in EasyARSceneView.o
(maybe you meant: _OBJC_CLASS_$_EasyARSceneView)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
只不过从x86_64换成了i386(注:x86_64是模拟器64位的cpu;i386是模拟器32位的cpu),1、以libBaiduSpeechSDK为例分析:既然lipo info显示支持模拟器而实际编译显示不支持模拟器,很可能是此sdk里打包了其他不支持模拟器的sdk。于是去此sdk官方网站查看了版本记录,明确指出我们工程里的版本是不支持模拟器的,但最新版本支持,于是把libBaiduSpeechSDK换为最新版本的。2、因为这几个不支持模拟器的sdk不是本部门负责的版块,二来,官方不是所有相应sdk都有支持模拟器版本。所以只要不影响我们板块是页面展示即可,故,不支持模拟器的sdk相关代码可以条件编译解决报错,编译代码如下:
#if TARGET_IPHONE_SIMULATOR
//模拟器代码,例如提醒是模拟器的debug代码
#else
//真机代码,即涉及到不支持模拟器的sdk相关的代码
#endif
所有报错的sdk相关代码用上边条件编译通过后,又出现编译报错:
Showing All Messages
fatal error: lipo: -extract x86_64 specified but fat file: /Users/yangyangzi/Library/Developer/Xcode/DerivedData/bxbank-accemshowhfuvgbynrcisxvxvaba/Build/Products/Debug_UAT_F-iphonesimulator/bxbank.app/Frameworks/IdcardQuality.framework/IdcardQuality does not contain that architecture
fatal error: lipo: -extract x86_64 specified but fat file: IdcardQuality does not contain that architecture
百度的ocr库报错:
这是百度库自带的坑,需要去掉其相关的支持模拟器的shell脚本,即Build Phase下的Run Script脚本即可,编译通过,这下模拟器可以运行了。但要注意的是,如果再用此过程打真机包这个shell脚本还是需要加上的。