南锋

南奔万里空,脱死锋镝余

IOS开发过程中Swift兼容库问题

今天在给IOS工程接入AdMob广告时,遇到下面问题
;

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库带进去。
这里不是代码错误,只需要加几个库即可。

方法一

把这几个.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加,最省事
打开:

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

加上这三行:

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

;
注意是加到主Target,不是Pods,也不是Project。
然后再确认:

1
Always Embed Swift Standard Libraries = YES

到这里,如果不出意外的意外,你会遇到这个问题library 'swiftCompatibility51' not found
;
这里在下面路径

1
2
Build Settings
→ Library Search Paths

;

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

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

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

后续bug

上面是解决不能编译问题,在运行的时候又遇到了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

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

+