Unity iOS构建错误:在使用Firebase Unity SDK和Google VR SDK for Unity时出现重复符号。

3
我正在开发一个Unity项目,其中我使用了Google VR SDK for Unity和Firebase SDK for Unity中的FirebaseMessaging.unitypackage。但是当我尝试为iOS构建时,这两个Google SDK的组合会导致“重复符号”错误。

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

要求:

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

步骤:

  1. 下载 Google VR SDK for Unity (v1.20)。
  2. 下载 Firebase SDK for Unity (v3.0.0)。
  3. 解压 Firebase SDK for Unity。
  4. 打开 Unity 并创建一个新项目。
  5. 转到 文件 > 构建设置...,选择 iOS 并单击“切换平台”。
  6. 打开 播放器设置... 并设置一个 包标识符
  7. 转到 资产 > 导入包 > 自定义包...,选择 GoogleVRForUnity.unitypackage 并导入除 Demos 文件夹以外的所有内容。
  8. 将出现弹出窗口。选择 我已备份,继续!
  9. 将出现另一个弹出窗口。选择 导入包 并全部导入。
  10. 转到 资产 > 导入包 > 自定义包...,选择已解压的 FirebaseMessaging.unitypackage 并全部导入。
  11. 文件 > 保存项目
  12. 将 iOS 设备连接到计算机。
  13. 文件 > 构建并运行
  14. Xcode 构建会失败,因为项目需要使用团队签名。在您的 Xcode 项目中将其设置为有效的。
  15. 按 Xcode 的播放按钮,在连接的 iOS 设备上构建并运行项目。

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

架构arm64有25个重复符号

架构取决于连接的iOS设备,但错误是相同的。

Error screenshot


  • 有什么我们可以做的吗?
  • 这是必须由谷歌解决的错误吗?
2个回答

2
这是GVR sdk中的一个错误。问题在于GVR发布时包含了传递依赖项,其中一些依赖项也被谷歌(或其他地方)的其他SDK所依赖,例如Firebase。由于Unity没有针对此进行任何软件包管理,因此我们自己开发了一个解决方案:https://github.com/googlesamples/unity-jar-resolver
但是,GVR sdk尚未使用这个解决方案来包含其传递依赖项,因此我们会遇到冲突。
我正在修复IOSResolver,使其能够检测到GVR中的此问题并剥离不应包含的对象。
同时,以下是一个解决方法,您可以使用它自己剥离多余的对象:
  1. Locate: libgvrunity.a in Assets/Plugins/iOS/libgvrunity.a
  2. Create a shell script in the folder with the following contents:

    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 and run from Unity again.


1
Option 1: 前往构建设置并搜索“无公共块”,将其设置为否。
Option 2:
  1. 前往目标设置中的构建阶段。
  2. 前往“链接二进制文件”。
  3. 检查是否有任何库重复存在。
  4. 重新构建。
Option 3:
  1. 从其他链接器标志中删除-ObjC。

Unity iOS构建默认已将“不共用块”设置为“否”,因此这并不能解决错误。我也已经尝试将其设置为“是”,但仍然无济于事。 - Gerard Reches
尝试从其他链接器标志中删除-ObjC。 - Varun Naharia
我也尝试过这样做,应用程序在没有-objC标志的情况下成功构建,但是启动后会崩溃。 - Gerard Reches
那么您的问题就解决了,您可以为您遇到的错误创建一个新的问题。顺便问一下,您在崩溃时遇到了什么错误? - Varun Naharia
1
根据这个问题的说法,如果我移除-ObjC标志,SDK和库将不会被加载。因此,构建不会抛出错误,因为库不会被加载。这不是一个解决方案。 - Gerard Reches

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接