Swift symbol(s) not found for architecture xxx 解决办法

对与Objective-C环境下,如果出现‘Undefined symbols for architecture xxx:’问题可以按照一下步骤排查

  1. 未导入框架
  2. 库路径 头文件路径不对 删除
  3. Other Linker Flags 改为 -lz或-ObjC
  4. 找不到库 删除重新导入静态库
  5. 是否支持armv7 armv64 i386

在Swift环境下却有些变化,我遇到在Swift环境下导入静态库,通过添加桥接文件成功调用API,但在编译阶段报‘symbol(s) not found for architecture xxx’错误,记录下排查思路:

现象

Xcode 10.1,Swift 4.2

创建新项目JDSwiftTestAlib,接入微博SDK:libWeiboSDK,新建桥接文件JDSwiftTestAlib-Bridging-Header.h

1
2
3
4
5
6
7
8
9
#ifndef JDSwiftTestAlib_Bridging_Header_h
#define JDSwiftTestAlib_Bridging_Header_h

#import "Test.h"

#import "libWeiBoSDK/WeiboSDK.h"


#endif

成功链接OC文件

/images/swift_error_a_001.png

运行错误

/images/swift_error_a_002.png

分析

symbol(s) not found for architecture xxx,优先考虑上文的5种情况,猜测可能是Build Setting中没有配置正确的link路径

/images/swift_error_a_003.png

但经过多次修改排除这个可能行,疑惑之下回归Log 分析

/images/swift_error_a_002.png

缺少某个库,log显示可能是Photo相关的库,对比了OC环境下正常的项目,并没有Phtot相关库,考虑到Swift环境由于API不稳定,并没有集成到iOS系统上,猜测可能是需要显式添加某些在OC环境下默认加载的framwork

/images/swift_error_a_004.png

添加Photo.framework

/images/swift_error_a_005.png

运行成功

结论

Swift环境和OC环境的差异需要区分,排查思路不够清晰,应该更注重log的分析,应该多了解下库的链接

  Total:    No.