如何让行不支持模拟器的sdk的ios工程支持模拟器运行

     在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脚本还是需要加上的。

 

      

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值