问题:使用过程完美无坑,这个库确实很强大。但是在某些机型上和打包上架的时候编译报错。
最近项目需要用到一些图片的特殊处理,比如马赛克,滤镜等等这些东西。本来都是去网上找图片像素化的代码来用的,后来出现了各种问题,一怒之下就直接使用GPUImage这个第三方了。
因为是第一次用这个库,肯定要去度娘寻找怎么使用的。如果记得没错,网上很多如何使用GPUImage的攻略帖,于是找了个比较详细的一步步来,最后完美无报错。
以为这样就完事了?不不不。偶然一次,因为说项目在iOS7.0环境下测试会崩溃,就去找了一台iOS7.x的测试机,现在7.x的机子确实比较难找了,是个4s,结果发现编译报错!报错:(一个警告,4个错误)
ld: warning: ignoring file /Users/JSB-leidong/Desktop/xxxx/WaterMarker/WaterMarker/library/GPUImage/libGPUImage.a, file was built for archive which is not the architecture being linked (armv7): /Users/JSB-leidong/Desktop/xxxx/WaterMarker/WaterMarker/library/GPUImage/libGPUImage.a
Undefined symbols for architecture armv7:
"OBJC_CLASS$_GPUImageKuwaharaFilter", referenced from:
objc-class-ref in MosaicViewController.o
"OBJC_CLASS$_GPUImageGaussianBlurFilter", referenced from:
objc-class-ref in MosaicViewController.o
"OBJC_CLASS$_GPUImagePixellateFilter", referenced from:
objc-class-ref in MosaicViewController.o
ld: symbol(s) not found for architecture armv7
你没看错就是这个该死的ld: symbol(s) not found for architecture xxxxx这个错误。曾经遇到过类似的错误。无非就是编译环境啊或者是其他的一点小问题。试了下之前的方法,居然无效!于是乎又上网查资料。一个上午加一个下午没搞定这个问题!
后来实在没辙,只能自己找问题。其实挺明显的就是静态库.a文件的问题。但是仔细想想不至于有什么问题啊,都是严格按照网上流程来的。后来又重新跑了几次重新生成静态库,还是一样的。之后一不小心在5上面跑了一下生成了静态库文件,这下就有味道了,在4s和5上面可以正常编译了,但是在5以上的机型就报错了!局势瞬间开朗有没有!
很明显这情况就是在什么环境下跑GPUImage项目生成静态库文件,那么这个静态库文件就是支持什么机型环境的,在其他的环境下就会报错。我也不知道为什么5以下(包括5)的机型是一类,然后5以上的又是一类,但事实就是这样。
解决方法:忽略网上的跑GPUImage的时候选择一个真机的那一步,去GitHub上把项目下载下来之后,打开,但是运行的时候不要选择任意一个真机,选择Generic iOS Device,然后点击运行,生成一个静态库文件,这个静态库文件就是支持任意真机的(PS:如果运行的时候选择某一机型,很可能打包上架的时候出现以上报错!)。如果还想项目再支持模拟器,那么把之前那个静态库文件复制粘贴一下,然后把运行环境换成模拟器,再运行一下,生成一个模拟器环境静态库,然后把两个静态库合并一下。
打开终端合并静态库:lipo -create 静态库1路径 静态库2路径 -output 新静态库路径
最后把新合并的静态库文件和usr文件夹一起拖到你自己的项目中,搞定!