Unity iOS build error: duplicate symbols when using Firebase Unity SDK + Google VR SDK for Unity

Unity iOS build error: duplicate symbols when using Firebase Unity SDK + Google VR SDK for Unity

我正在开发一个 Unity 项目,我在其中使用 Google VR SDK for UnityFirebaseMessaging.unitypackage 来自 Unity 的 Firebase SDK

当我尝试为 iOS.

构建时,Google SDK 的这种组合会引发 duplicate symbols 错误

重现错误的最小、完整且可验证的示例:

要求:

步骤:

  1. Download Google Unity VR SDK (v1.20)。
  2. Download 适用于 Unity 的 Firebase SDK (v3.0.0)。
  3. 解压适用于 Unity 的 Firebase SDK。
  4. 打开 Unity 并创建一个新项目。
  5. 转到 文件 > 构建设置...,select iOS 并单击切换平台。
  6. 打开Player Settings...并设置Bundle Identifier.
  7. 转到 Assets > Import Package > Custom package...,select GoogleVRForUnity.unitypackage 并导入除 Demos 之外的所有内容 文件夹。
  8. 将出现一个弹出窗口 window。 Select 我做了备份,继续吧!.
  9. 将出现另一个弹出窗口 window。 Select导入包全部导入
  10. 转到 Assets > Import Package > Custom package...,select 解压缩的 FirebaseMessaging.unitypackage 并导入所有内容。
  11. 文件 > 保存项目
  12. 将 iOS 设备连接到计算机。
  13. 文件 > 构建 & 运行
  14. Xcode 构建将失败,因为该项目需要与团队签约。在您的 Xcode 项目中将其设置为有效的。
  15. 按 Xcode 播放按钮在您连接的 iOS 设备上构建和 运行 项目。

基于 Xcode 构建的项目将以以下错误结束:

25 duplicate symbols for architecture arm64

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


选项 1:转到构建设置并搜索 "No Common Blocks" 并将其设置为否

选项 2:

  1. 转到目标设置中的构建阶段。
  2. 转到“Link二进制与 图书馆”。
  3. 检查是否有任何库存在两次。
  4. 再次构建。

选项 3:

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

这是 GVR SDK 中的错误。问题是 GVR 的发布包括传递依赖项,google(或其他地方)的其他 SDK 也依赖于其中一些,例如 firebase。由于 Unity 对此没有任何包管理,我们推出了自己的包管理:

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

但是 GVR sdk 尚未使用它来包含其传递依赖项,因此我们遇到了冲突。

我正在修复上面的 IOSResolver,在 GVR 中检测到它并删除不应包含的对象。

同时,您可以使用以下变通方法自行删除冗余对象:

  1. 在Assets/Plugins/iOS/libgvrunity.a
  2. 中找到:libgvrunity.a
  3. 在文件夹中创建一个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
    
  4. 再次从 Unity 构建和 运行。