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 Unity 和FirebaseMessaging.unitypackage
来自 Unity 的 Firebase SDK。
当我尝试为 iOS.
构建时,Google SDK 的这种组合会引发 duplicate symbols
错误
重现错误的最小、完整且可验证的示例:
要求:
步骤:
- Download Google Unity VR SDK (v1.20)。
- Download 适用于 Unity 的 Firebase SDK (v3.0.0)。
- 解压适用于 Unity 的 Firebase SDK。
- 打开 Unity 并创建一个新项目。
- 转到 文件 > 构建设置...,select iOS 并单击切换平台。
- 打开Player Settings...并设置Bundle Identifier.
- 转到 Assets > Import Package > Custom package...,select
GoogleVRForUnity.unitypackage
并导入除 Demos 之外的所有内容 文件夹。
- 将出现一个弹出窗口 window。 Select 我做了备份,继续吧!.
- 将出现另一个弹出窗口 window。 Select导入包和全部导入。
- 转到 Assets > Import Package > Custom package...,select 解压缩的
FirebaseMessaging.unitypackage
并导入所有内容。
- 文件 > 保存项目
- 将 iOS 设备连接到计算机。
- 文件 > 构建 & 运行
- Xcode 构建将失败,因为该项目需要与团队签约。在您的 Xcode 项目中将其设置为有效的。
- 按 Xcode 播放按钮在您连接的 iOS 设备上构建和 运行 项目。
基于 Xcode 构建的项目将以以下错误结束:
25 duplicate symbols for architecture arm64
体系结构根据连接的 iOS 设备而变化,但错误是相同的。
- 有什么我们可以做的吗?
- 是否是必须由Google解决的错误?
选项 1:转到构建设置并搜索 "No Common Blocks" 并将其设置为否
选项 2:
- 转到目标设置中的构建阶段。
- 转到“Link二进制与
图书馆”。
- 检查是否有任何库存在两次。
- 再次构建。
选项 3:
- 从其他链接器标志中删除了 -ObjC。
这是 GVR SDK 中的错误。问题是 GVR 的发布包括传递依赖项,google(或其他地方)的其他 SDK 也依赖于其中一些,例如 firebase。由于 Unity 对此没有任何包管理,我们推出了自己的包管理:
https://github.com/googlesamples/unity-jar-resolver
但是 GVR sdk 尚未使用它来包含其传递依赖项,因此我们遇到了冲突。
我正在修复上面的 IOSResolver,在 GVR 中检测到它并删除不应包含的对象。
同时,您可以使用以下变通方法自行删除冗余对象:
- 在Assets/Plugins/iOS/libgvrunity.a
中找到:libgvrunity.a
在文件夹中创建一个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
再次从 Unity 构建和 运行。
我正在开发一个 Unity 项目,我在其中使用 Google VR SDK for Unity 和FirebaseMessaging.unitypackage
来自 Unity 的 Firebase SDK。
当我尝试为 iOS.
构建时,Google SDK 的这种组合会引发duplicate symbols
错误
重现错误的最小、完整且可验证的示例:
要求:
步骤:
- Download Google Unity VR SDK (v1.20)。
- Download 适用于 Unity 的 Firebase SDK (v3.0.0)。
- 解压适用于 Unity 的 Firebase SDK。
- 打开 Unity 并创建一个新项目。
- 转到 文件 > 构建设置...,select iOS 并单击切换平台。
- 打开Player Settings...并设置Bundle Identifier.
- 转到 Assets > Import Package > Custom package...,select
GoogleVRForUnity.unitypackage
并导入除 Demos 之外的所有内容 文件夹。 - 将出现一个弹出窗口 window。 Select 我做了备份,继续吧!.
- 将出现另一个弹出窗口 window。 Select导入包和全部导入。
- 转到 Assets > Import Package > Custom package...,select 解压缩的
FirebaseMessaging.unitypackage
并导入所有内容。 - 文件 > 保存项目
- 将 iOS 设备连接到计算机。
- 文件 > 构建 & 运行
- Xcode 构建将失败,因为该项目需要与团队签约。在您的 Xcode 项目中将其设置为有效的。
- 按 Xcode 播放按钮在您连接的 iOS 设备上构建和 运行 项目。
基于 Xcode 构建的项目将以以下错误结束:
25 duplicate symbols for architecture arm64
体系结构根据连接的 iOS 设备而变化,但错误是相同的。
- 有什么我们可以做的吗?
- 是否是必须由Google解决的错误?
选项 1:转到构建设置并搜索 "No Common Blocks" 并将其设置为否
选项 2:
- 转到目标设置中的构建阶段。
- 转到“Link二进制与 图书馆”。
- 检查是否有任何库存在两次。
- 再次构建。
选项 3:
- 从其他链接器标志中删除了 -ObjC。
这是 GVR SDK 中的错误。问题是 GVR 的发布包括传递依赖项,google(或其他地方)的其他 SDK 也依赖于其中一些,例如 firebase。由于 Unity 对此没有任何包管理,我们推出了自己的包管理:
https://github.com/googlesamples/unity-jar-resolver
但是 GVR sdk 尚未使用它来包含其传递依赖项,因此我们遇到了冲突。
我正在修复上面的 IOSResolver,在 GVR 中检测到它并删除不应包含的对象。
同时,您可以使用以下变通方法自行删除冗余对象:
- 在Assets/Plugins/iOS/libgvrunity.a 中找到:libgvrunity.a
在文件夹中创建一个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
再次从 Unity 构建和 运行。