iOS 14 链接模块标志“矮人版本”:ID 具有冲突行为

Posted

技术标签:

【中文标题】iOS 14 链接模块标志“矮人版本”:ID 具有冲突行为【英文标题】:iOS 14 linking module flags 'Dwarf Version': IDs have conflicting behaviors 【发布时间】:2021-01-15 09:19:57 【问题描述】:

我正在尝试使我的应用与 ios 14 (Xcode 12.3) 兼容。在链接阶段构建失败并出现以下错误:

ld: linking module flags 'Dwarf Version': IDs have conflicting behaviors in 'xxx.o' and 'ld-temp.o'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我在下面搜索了解决方案。解决方法是关闭 Link-Time Optimization 或将 Link-Time Optimization 从 Monolithic 更改为 Incremental。

https://***.com/questions/39125409/xcode-8-beta-6-conflicting-values-for-architecture
https://github.com/facebook/facebook-ios-sdk/issues/1560

我尝试将链接时间优化从单片更改为增量,它解决了我的问题。所以我的问题是:

    有人知道如何调试这种链接冲突问题的根本原因吗? 为什么在使用 iOS 14 构建时会出现此链接冲突问题,但在以前的版本中没有? 改变 LTO 是唯一的解决方案吗?

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。就我而言,xxx.o 是一个编译为位码的库。我分析了库中的 .o 文件,它们既不是 coff 也不是 macho 文件。相反,它们被包装了 bc 文件。见https://llvm.org/docs/BitCodeFormat.html

你可以使用文件来分析它。 问题是位码文件的调试信息存储为 Dwarf-2,而 .o 文件确实有 Dwarf-4。添加-gdwarf-2选项不起作用,因为llvm首先编译成bitcode,也就是dwarf2。

修复方法是使用 llc 将作为打包 bc 文件的 .o 文件转换为真正的 .o 文件。如果你有一个库,它会变得有点复杂,你需要先从库中提取包装好的 .o 文件,将它们转换为真正的 .o 文件并创建一个新库。

【讨论】:

以上是关于iOS 14 链接模块标志“矮人版本”:ID 具有冲突行为的主要内容,如果未能解决你的问题,请参考以下文章

Firebase、Fabric 和 Crashlytics,带有 -ObjC 链接器标志,没有 Cocoapods iOS

SwiftUI:在 iOS 14 上点击返回时导航链接崩溃,但在 iOS 13 上没有

我可以将适用于 iOS 的 GoogleMaps SDK 与 -ObjC 以外的链接器标志链接吗

MySQL Join 一对多关系的语法

iOS 中具有两个不同跟踪 ID 的 Google Analytics(目标 C)

Android Gradle 插件组件化中的 Gradle 构建脚本实现 ② ( 组件化基本实现 | Project 相关目录 | 定义组件切换标志位 | 切换插件导入 | 切换设置应用 ID )