南锋

南奔万里空,脱死锋镝余

Xcode Undefined symbol swiftCompatibility51 / 56 / Concurrency 解决方法

在 iOS 工程接入 AdMob 等包含 Swift 编译产物的 SDK 后,Xcode 链接阶段可能出现 swiftCompatibility51、swiftCompatibility56 或 swiftCompatibilityConcurrency 的 Undefined symbol 错误。这通常表示最终链接时没有正确找到 Swift Compatibility Libraries。

swiftCompatibility51 错误现象

Xcode Undefined symbol swiftCompatibility51 / 56 / Concurrency 解决方法 — swiftCompatibility51 错误现象;

1
2
3
Undefined symbol: __swift_FORCE_LOAD_$_swiftCompatibility51
Undefined symbol: __swift_FORCE_LOAD_$_swiftCompatibility56
Undefined symbol: __swift_FORCE_LOAD_$_swiftCompatibilityConcurrency

其实这三个是同一类问题:工程里用了Swift/Swift编译产物,但最终链接阶段没有把对应的Swift Compatibility库带进去。
这里不是代码错误,只需要加几个库即可。

方法一:添加 libswiftCompatibility .tbd

把这几个.tbd加到主App Target的Link binary With Libraries
具体方法:

1
2
3
4
5
6
主App Target
→ Build Phases
→ Link Binary With Libraries
→ +
→ 搜索 libswiftCompatibility51.tbd
→ 选择 Apple SDKs 下的结果

如果你点+搜索出来有三个同名结果:

1
2
3
Project
Apple SDKs
Developer Frameworks

优先选择Apple SDKs不要选Project,那个通常是工程里已有的引用,不一定指向当前 Xcode SDK 的正确 .tbd 文件。

加完之后建议执行:

1
Product → Clean Build Folder

方法二:配置 Other Linker Flags

如果你在用方法一的时候点+没有可以选择的,可以改用方法二
直接用Other Linker Flags加,最省事
打开:

1
2
3
主Target
→ Build Settings
→ Other Linker Flags

加上这三行:

1
2
3
4
$(inherited)
-lswiftCompatibility51
-lswiftCompatibility56
-lswiftCompatibilityConcurrency

Xcode Undefined symbol swiftCompatibility51 / 56 / Concurrency 解决方法 — 方法二:配置 Other Linker Flags;
注意是加到主Target,不是Pods,也不是Project。
然后再确认:

1
Always Embed Swift Standard Libraries = YES

到这里,如果不出意外的意外,你会遇到这个问题library 'swiftCompatibility51' not found
Xcode Undefined symbol swiftCompatibility51 / 56 / Concurrency 解决方法 — 方法二:配置 Other Linker Flags;
这里在下面路径

1
2
Build Settings
→ Library Search Paths

Xcode Undefined symbol swiftCompatibility51 / 56 / Concurrency 解决方法 — 方法二:配置 Other Linker Flags;

1
2
3
$(inherited)
$(SDKROOT)/usr/lib/swift
$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)

温馨小提示:这些地方如果不太好找,可以直接搜索关键词,很快就能跳出来

到这里,你的工程完成编译是没什么问题了。

Failed to look up symbolic reference 运行时错误

上面是解决不能编译问题,在运行的时候又遇到了Failed to look up symbolic reference at 0x102b818e7 - offset 470721 - symbol symbolic _____Sg ScP in这个问题,直接导致应用卡死。

这个其实也是兼容的问题,和上面区别在于一个都不能编译,一个是在使用相关功能的时候才会出现。

解决方法,重点检查下面几个地方
1、主 Target 里继续检查:

1
Build Settings -> Runpath Search Paths

确保有:

1
2
$(inherited)
/usr/lib/swift

Google 的手动接入说明里也要求添加 /usr/lib/swiftRunpath Search Paths,并且 Other Linker Flags-ObjCGoogle Ad Manager

再检查

1
Build Settings -> Other Linker Flags

确保有:

1
2
$(inherited)
-ObjC

我这里是因为少了一点东西,加上后就没问题了,代码也能够正常运行。