Unity iOS构build错误:使用Firebase Unity SDK + Google VR SDK for Unity时出现重复符号

我正在开发一个Unity项目 ,使用Google VR SDK for UnityFirebase SDK for Unity中FirebaseMessaging.unitypackage

当我尝试为iOS构build时,Google SDK的这种组合会引发duplicate symbols错误。


最小,完整和可validation的例子来重现错误:

要求:

  • iOS设备(版本7.0或更高版本)
  • 计算机与macOS
  • 最新的Unity版本(5.5.2f1)
  • 最新的Xcode版本(8.2.1)

脚步:

  1. 下载适用于Unity的Google VR SDK(v1.20)。
  2. 下载适用于Unity的Firebase SDK(v3.0.0)。
  3. 解压缩用于Unity的Firebase SDK。
  4. 打开Unity并创build一个新项目。
  5. 转到文件>构build设置… ,selectiOS,然后单击切换平台。
  6. 打开播放器设置…并设置套件标识符
  7. 转到资源>导入包>自定义包… ,selectGoogleVRForUnity.unitypackage ,然后导入除演示文件夹以外的所有文件夹。
  8. 一个popup窗口将出现。 select我做了备份,前进!
  9. 另一个popup窗口将出现。 select导入包导入全部。
  10. 转到资源>导入包>自定义包… ,select解压缩的FirebaseMessaging.unitypackage并导入所有。
  11. 文件>保存项目
  12. 将iOS设备连接到电脑。
  13. 文件>构build和运行
  14. Xcode构build将失败,因为项目需要与团队签名。 在你的Xcode项目中设置为有效的。
  15. 按Xcode播放button在您连接的iOS设备上构build并运行项目。

在Xcode上构build的项目将以下列错误结束:

架构arm64的25个重复符号

架构根据所连接的iOS设备而变化,但是错误是相同的。

错误截图


  • 有什么我们可以做的吗?
  • 这是Google必须解决的错误吗?

这是GVR sdk中的一个bug。 问题是,GVR被发布,包括传递依赖,其中一些在谷歌(或别处)的其他SDK也依赖于,如firebase。 由于Unity没有任何包pipe理,我们已经推出了自己的:

https://github.com/googlesamples/unity-jar-resolver

但是GVR sdk还没有使用它来包含它的传递依赖,所以我们得到了冲突。

我正在修复上面的IOSResolver,在GVR中检测到这个问题,并去掉那些不应该被包含的对象。

在此期间,您可以使用以下方法自行去除冗余对象:

  1. 在Assets / Plugins / iOS / libgvrunity.a中findlibgvrunity.a
  2. 在具有以下内容的文件夹中创build一个shell脚本:

     set -ex lipo libgvrunity.a -thin armv7 -output libgvrunity-armv7.a lipo libgvrunity.a -thin arm64 -output libgvrunity-arm64.a ar -t libgvrunity-armv7.a | grep 'GTMLogger\|GTMSession' | xargs ar -dv libgvrunity-armv7.a ar -t libgvrunity-arm64.a | grep 'GTMLogger\|GTMSession' | xargs ar -dv libgvrunity-arm64.a lipo libgvrunity.a -replace armv7 libgvrunity-armv7.a -replace arm64 libgvrunity-arm64.a -output libgvrunity-fat.a rm libgvrunity-armv7.a libgvrunity-arm64.a mkdir -p backup mv libgvrunity.a backup mv libgvrunity-fat.a libgvrunity.a 
  3. 再次build立并运行Unity。

选项1:转到构build设置并search“无公共块”并将其设置为否

选项2:

  1. 转到目标设置中的构build阶段。
  2. 转到“与库链接二进制文件”。
  3. 检查是否有任何库存在两次。
  4. 重新构build。

备选案文3:

  1. 从其他链接器标志中删除了-ObjC。