以下条件Xcode才会报这个错误:
build target是真机不是模拟器other link flags 添加了 -ObjC8.0以上的的SDK打包,使用的时候Xcode的iPhone SDK小于8.0,换句话说就是Xcode6打包的静态库用Xcode5来运行其实这是苹果的一个bug.没有对no-Metal的设备即armv7&armv7s做向后兼容
CoreVideo.h可以看出来这点:
#if COREVIDEO_SUPPORTS_METAL
#include
#include
#endif
COREVIDEO_SUPPORTS_METAL是这样定义的:#if TARGET_OS_IPHONE,这是不够的,因为armv7/s设备不支持Metal
XCode5苹果引进了新linksflags,Link Frames Automatically,Defalut值是YES.目的为了减少开发者添加framework的工作量.在引入这个之前开发者使用framework必须link到工程。这个flag让开发者们更简单的使用framework. 对报错的framework执行以下命令:
otool -arch armv7 –l Xxxxx.framework/Xxxxx
我们可以看到以下内容:
Load command 14
cmd LC_LINKER_OPTION
cmdsize 32
count 2
string #1 -framework
string #2 OpenGLES
Load command 15
cmd LC_LINKER_OPTION
cmdsize 32
count 2
string #1 -framework
string #2 Metal
Load command 16
正如你所看到的,这将导致linker隐式使用Metal
在苹果没解决这个问题之前。可以通过以下两种方法来避免编译错误:
1>. 直接用Xcode5来生成lib和framework
2>. Xcode6 Build Setting-->Link Frameworks Automatically设置为NO,设置这个之后,Xcode 可能会报更多的错误,因为现在不会自动link框架了,根据报错添加对应的framework即可.