以下条件Xcode才会报这个错误:
build target
是真机不是模拟器other link flags
添加了 -ObjC
8.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
苹果引进了新links
flags,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
即可.