最近项目要添加新功能了,真是懒的写,可是既然要写,就要从中学到点新东西。Swift已经发布了两年了,我居然还没用过,太不应该了。
项目开动啦,还是用cocoapods引入几个swift库先。一上来就遇到问题!
Screen Shot 2016-09-17 at 6.21.59 PM.png
没问题,太好解决的了,cocoapods的提示都已经说明了解决办法,在podfile里直接加上use_frameworks!就行了
Screen Shot 2016-09-17 at 6.29.41 PM.png
为什么使用swift库要加这句呢,原来Apple不允许build包含swift静态库了。而cocoapods使用了frameworks方式来集成swift库,就是use_frameworks!这句话了。
参考:http://blog.cocoapods.org/CocoaPods-0.36/
好了,应该没什么问题了吧,command+B,编译一下试试。
Screen Shot 2016-09-17 at 5.43.02 PM.png
这个linker error太常见了,开始以为一下就能搞定了,没想到弄了好几天,汗!明显是链接器没有找到AFNetworking的这个库嘛。看到一般解决这个问题是三种方法
第一种:点击 XCode 工程文件,在 Build Phases 中查看 “ Link binary With Libraries”,奇怪并没有链接AFNetworking。(一般应该能发现有一到数个的条目是用红色字体来显示的,这样才导致链接不到,应该是Pods的target集合所有库生成一个pod.a或者pod.framework)
Screen Shot 2016-09-17 at 7.02.16 PM.png
第二种:在工程的 Target 中选中要执行编译的target,然后 “get info”,打开 Build Settings页面,在 “ Library Search Path” 中添加缺失链接库的所在文件夹的路径。(这个因为是cocoapods管理的所需的库,一般到是没什么问题,是由$(inherited)搞定的,这个后面会讲到)
第三种:关闭XCode,再用pod install 命令重新安装,成功后再打开XCode编译项目。对我来说试了好多次都不行,完全是死马当活马医啦!
这样搞了好几天,还是不行。于是深刻感觉到cocoapods使用起来是真方便,可是一但出问题,而且不太常见的话,就会被迫要懂一点XCode build的过程了。只能继续分析error message了,经常看见use -v to see invocation,这个命令行参数-v该怎么加,我还是不懂,要是有人知道,千万要告诉我,谢谢啦!还是看下build error先啦。
Screen Shot 2016-09-17 at 7.24.29 PM.png
看了好久终于发现点蛛丝马迹。“-ObjC -lAFNetworking -lARGenericTableViewController -lFLKAutoLayout -lFTPopOverMenu -lFontAwesome -lFontAwesomeIconFactory -lJLRoutes -lMBProgressHUD -lMantle -lMasonry -lObjectiveSugar -lSDWebImage -lSLExpandableTableView -lUIAlertView+Blocks -lUICKeyChainStore -lUITextView+Placeholder”。怎么会这样,不是说用frameworks替代了静态库了吗,看来问题出在这里了,编译的时候XCode还是想去链接AFNetworking的静态库。一直就觉得是use_frameworks导致的,就去查看cocoapods生成的.xcconfig文件。
Screen Shot 2016-09-17 at 5.23.13 PM.png
仔细看发现其中并没有-lAFNetworking这样的一个LDFLAGS,在stackoverflow上找了好久才偶然发现问题出在Build Settings里Other Linker Flags
Screen Shot 2016-09-17 at 10.10.57 PM.png
Screen Shot 2016-09-17 at 10.12.59 PM.png
原来项目从纯OC过来的,从前cocoapods生成的一些-l"AFNetworking"之类的flags还在,问题就在这里了,其实解决方法直接删掉,留下$(inherited)就行了,那删掉了XCode还知道怎么链接吗,其实是知道的,关键就在inherited上,原来xcode的这些config项存在继承链。Resolved <- Target <- xcconfig <- Project <- iOS Default。顺序是从右到左,cocoapods生成的xcconfig文件优先级高于在target里的设置。
困扰了好几天,感觉cocoapods虽然帮助我们很多,我们不用像写makefile那样麻烦,可是好像失去了好多对项目的掌控力,还是要懂一点编译过程比较好。
还是学到了好多东西,光从库方面讲,发现到XCode链接需要经过好几个阶段,首先要找到库的头文件路径,在build settings里的Header Search Paths设置
Screen Shot 2016-09-17 at 9.35.39 PM.png
然后去找library的位置,在build settings里的Library Search Paths设置
Screen Shot 2016-09-17 at 9.21.00 PM.png
如果编译出错的话build phases的link binary with library里的Pods项目就会出现红字(不过好像使用了framework之后,Pods的framework还是照常生成,因为是动态链接,记得静态链接的时候生成的.a文件的确是红色的)
Screen Shot 2016-09-17 at 7.02.16 PM.png
最后XCode要链接哪些库是在Other Linker Flags里设置的
Screen Shot 2016-09-17 at 10.12.59 PM.png
同时这些设置cocoapods又把这些设置集中在类似父类的xcconfig文件中
Screen Shot 2016-09-17 at 9.30.46 PM.png
好了,写的好长,其实没什么内容,不过我花了这么长时间搞定的,不写长点不甘心呐。
文/NSWhoohoo(简书作者)
原文链接://www.greatytc.com/p/d0dc92d9a31b
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
还有可能是Build Phases 里的Link Binary With Libraries 里面的pods文件有两个删掉其中一个就好了
注:以下两张图片文件需一致