我正在尝试使用iOS版本的ORB_SLAM2(https://github.com/ygx2011/ORB_SLAM2-IOS)作为Unity(Unity 5.5)项目的插件。为了能够将其用作插件,我从上面的iOS应用程序创建了一个静态库(位于Assets / Plugins / iOS /目录中的.a文件),可用于子类化UnityAppController。
现在,在Unity播放器设置中,我将脚本后端更改为IL2CPP,将架构更改为arm64。我这样做的原因是因为根据Unity 5.5 Legacy文档,IL2CPP是唯一支持在iOS上部署到ARM 64位的脚本后端。
当我构建并运行生成的Xcode项目时,我在arm64架构方面遇到以下错误。
架构arm64的未定义符号:
" cv :: String :: deallocate()",引自: libvBSlamLib.a中的cv :: String :: ~String()(ORBSlamLib.o) libvBSlamLib.a中的cv :: String :: operator =(cv :: String const&)(ORBSlamLib.o)
" cv :: error(int,cv :: String const&,char const *,char const *,int)",引自:cv :: Mat :: operator cv :: Vec libORBSlamLib.a(ORBSlamLib.o)中的libORBSlamLib.a(ORBSlamLib.o)cv :: Mat :: Mat(int,int,int,void *,unsigned long)中的()const
" cv :: Mat :: Mat(cv :: Mat const&,cv :: Range const&,cv :: Range const&)",从cv :: Mat :: colRange引用(int,int)const liborBSlamLib.a(ORBSlamLib.o)cv :: Mat :: rowRange(int,int)const liborBSlamLib.a(ORBSlamLib.o)cv :: mat :: col(int)const in libORBSlamLib .A(ORBSlamLib.o)
&#34; ORB_SLAM2 :: System :: TrackMonocular(cv :: Mat const&amp;,double const&amp;)&#34;,引自: - liborBSlamLib.a中的[ORBSlamLib libProcessImage:](ORBSlamLib.o)< / p>
&#34; cv :: projectPoints(cv :: _ InputArray const&amp;,cv :: _ InputArray const&amp;,cv :: _ InputArray const&amp;,cv :: _ InputArray const&amp;,cv :: _ InputArray const&amp;,cv :: _OutputArray const&amp;,cv :: _ OutputArray const&amp;,double)&#34;,引自: - liborBSlamLib.a中的[ORBSlamLib libProcessImage:](ORBSlamLib.o)
&#34; cv :: circle(cv :: InputOutputArray const&amp;,cv :: Point ,int,cv :: Scalar_ const&amp;,int,int,int)&#34; ,引自: - liborBSlamLib.a中的[ORBSlamLib libProcessImage:](ORBSlamLib.o)
&#34; _inverse&#34;,引自: Bulk_Assembly-CSharp_3.o中的_LLIMUPosMgr_inverse_m3594686272 Bulk_Assembly-CSharp_3.o中的_LLIMUPosMgr_KFUpdate_m728291423
&#34; cv :: noArray()&#34;,引自: - libORBSlamLib.a中的[ORBSlamLib libProcessImage:](ORBSlamLib.o)
&#34; _multiply&#34;,引自: Bulk_Assembly-CSharp_3.o中的_LLIMUPosMgr_multiply_m1606521480 Bulk_Assembly-CSharp_3.o中的_LLIMUPosMgr_KFPredict_m2919581928 Bulk_Assembly-CSharp_3.o中的_LLIMUPosMgr_KFUpdate_m728291423
&#34; _subtract&#34;,引自: Bulk_Assembly-CSharp_3.o中的_LLIMUPosMgr_subtract_m949145514 Bulk_Assembly-CSharp_3.o中的_LLIMUPosMgr_KFUpdate_m728291423
&#34; cv :: Rodrigues(cv :: _ InputArray const&amp;,cv :: _ OutputArray const&amp;,cv :: _ OutputArray const&amp;)&#34;,引自: - libORBSlamLib.a中的[ORBSlamLib libProcessImage:](ORBSlamLib.o)
&#34; cv :: fastFree(void *)&#34;,引自: SlamAppController.o中的_mGetPose libvBSlamLib.a中的cv :: Mat :: ~Mat()(ORBSlamLib.o)
&#34; _add&#34;,引自: Bulk_Assembly-CSharp_3.o中的_LLIMUPosMgr_add_m3985982311
我注意到大多数这些错误都发生在opencv函数中,所以我交叉检查项目中包含的opencv2.framework是否支持arm64。但是从opencv论坛上我们提到最新版本的opencv确实支持arm64(我克隆了opencv GitHub存储库并按照opencv文档中的这些说明来生成框架)。我已经使用了How to update our static library architecture for suporting arm64 Build?,http://answers.unity3d.com/questions/912000/apple-mach-o-linker-error-when-building.html,Undefined symbols for architecture armv7等帖子中常用的推荐解决方案。在我发现的论坛中,以下版本设置适用于其他人。
架构 - 标准ARCHS。
仅构建活动架构 - 将调试设置为YES;发布设置为NO。
支持的平台 - iphoneos
有效架构 - arm64 armv7 armv7s
框架搜索路径 - $(PROJECT_DIR)opencv2.framework所在的位置。
C ++语言方言 - GNU ++ 11(无法将此设置为C ++ 11,因为另一个名为GLKit的框架需要GNU ++ 11 - 这可能是问题吗?有解决方法吗? )
C ++标准库 - 支持C ++ 11的libc ++ LLVM C ++标准库。
我是Unity&amp; amp;的初学者iOS和任何帮助将非常感激。我在我的项目中使用Unity 5.5.2f1,Xcode 9 beta 3和带有iOS 11 beta 4的iPhone 7 Plus。
P.S。如果直接编译为iOS应用程序,ORB_SLAM2-IOS可以正常工作。仅当我尝试将其用作静态库时才会出现此问题。
谢谢!