【问题标题】:Unity iOS build error: duplicate symbols when using Firebase Unity SDK + Google VR SDK for UnityUnity iOS 构建错误:使用 Firebase Unity SDK + Google VR SDK for Unity 时出现重复符号
【发布时间】:2017-07-19 21:21:42
【问题描述】:

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

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


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

要求:

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

步骤:

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

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

架构 arm64 的 25 个重复符号

架构会根据连接的iOS设备而变化,但错误是一样的。


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

【问题讨论】:

    标签: ios xcode unity3d firebase google-vr


    【解决方案1】:

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

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

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

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

    与此同时,您可以使用以下解决方法自行剥离冗余对象:

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

    【讨论】:

      【解决方案2】:

      选项 1:转到构建设置并搜索“No Common Blocks”并将其设置为 no

      选项2:

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

      选项 3:

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

      【讨论】:

      • Unity iOS 版本已经默认将No Common Blocks 设置为No,所以这并不能解决错误。另外我已经尝试将其设置为Yes,没有任何变化。
      • 尝试从其他链接器标志中删除 -ObjC
      • 我也试过了,应用在没有-objC标志的情况下成功构建,但在启动时崩溃。
      • 那么你的问题就解决了,你可以为你遇到的错误创建新问题,顺便说一句,你在崩溃时遇到了什么错误?
      • 好吧,根据this question,如果我删除-ObjC 标志,SDK 和库将不会被加载。所以构建不会抛出错误,因为不会加载库。这不是解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多