1.遇到问题:
ld: warning: ignoring file /Users/xxx/Library/Developer/Xcode/DerivedData/kxmovie-eilzobgtafjobffcieyxpdqrvsam/Build/Products/Debug-iphonesimulator/libNSLogger.a, file was built for archive which is not the architecture being linked (i386)
字面意思就是当前使用的libNSLogger.a库,不匹配需要进行链接的结构i386。
查看库的架构可以在终端使用命令:
lipo -info xxx.a //后面是库的地址
查了下,libNSLogger.a的架构是x86_64。而在模拟器上运行,如果Build Active Architecture Only 选择为NO,库的架构是x86_64 i386的混合库:
Architectures in the fat file: /Users/xxx/Library/Developer/Xcode/DerivedData/kxmovie-eilzobgtafjobffcieyxpdqrvsam/Build/Products/Release-iphonesimulator/libPods-KxMovieExample.a are: i386 x86_64
我的错误是在编译libNSLogger.a的时候,Build Active Architecture Only选择了YES,导致编出来只有x86_64,而APP本身却选择了NO,也就是还需要i386,所以架构不对,导致了上面的问题。
总结来说:
(1)APP包本身有一个架构设置,在Build Setting->Architectures里面设定;真机上编译就是你设定的架构,如arm64 arm7s;如果Build Active Architecture Only设为YES,就会只编译你当前使用的环境的架构,比如你连上iPhone6,就只会编译arm64的。模拟器上编译就上上面的i386 x86_64.
(2)引用的静态库也有自己的架构,如果APP需求的架构在静态库了没有,就找不到对应的函数了,报错。
当APP引用较为复杂是,这一点还是容易搞混的。
最后,静态库是可以合并的,把两种不同架构的静态库合成一个静态库,这样模拟器、真机可以使用一个库,方便些。
lipo -create 库1.a 库2.a 库3.a -output 复合库.a