今天在给IOS工程接入AdMob广告时,遇到下面问题
;
1 | Undefined symbol: __swift_FORCE_LOAD_$_swiftCompatibility51 |
其实这三个是同一类问题:工程里用了Swift/Swift编译产物,但最终链接阶段没有把对应的Swift Compatibility库带进去。
这里不是代码错误,只需要加几个库即可。
方法一
把这几个.tbd加到主App Target的Link binary With Libraries
具体方法:
1 | 主App Target |
如果你点+搜索出来有三个同名结果:
1 | Project |
优先选择Apple SDKs不要选Project,那个通常是工程里已有的引用,不一定指向当前 Xcode SDK 的正确 .tbd 文件。
加完之后建议执行:
1 | Product → Clean Build Folder |
方法二
如果你在用方法一的时候点+没有可以选择的,可以改用方法二
直接用Other Linker Flags加,最省事
打开:
1 | 主Target |
加上这三行:
1 | $(inherited) |
;
注意是加到主Target,不是Pods,也不是Project。
然后再确认:
1 | Always Embed Swift Standard Libraries = YES |
到这里,如果不出意外的意外,你会遇到这个问题library 'swiftCompatibility51' not found
;
这里在下面路径
1 | Build Settings |
;
加
1 | $(inherited) |
温馨小提示:这些地方如果不太好找,可以直接搜索关键词,很快就能跳出来
到这里,你的工程完成编译是没什么问题了。
后续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 | $(inherited) |
Google 的手动接入说明里也要求添加 /usr/lib/swift 到 Runpath Search Paths,并且 Other Linker Flags 加 -ObjC。Google Ad Manager
再检查
1 | Build Settings -> Other Linker Flags |
确保有:
1 | $(inherited) |
我这里是因为少了一点东西,加上后就没问题了,代码也能够正常运行。