not found metal for architecture armv7

The scene

以下条件Xcode才会报这个错误:

  • build target是真机不是模拟器
  • other link flags 添加了 -ObjC
  • 静态库是用8.0以上的的SDK打包,使用的时候Xcode的iPhone SDK小于8.0,换句话说就是Xcode6打包的静态库用Xcode5来运行

The Reason

其实这是苹果的一个bug.没有对no-Metal的设备即armv7&armv7s做向后兼容

CoreVideo.h可以看出来这点:


#if COREVIDEO_SUPPORTS_METAL
#include 
#include 
#endif

COREVIDEO_SUPPORTS_METAL是这样定义的:#if TARGET_OS_IPHONE,这是不够的,因为armv7/s设备不支持Metal

Link Frameworks Automatically

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

The Solution

在苹果没解决这个问题之前。可以通过以下两种方法来避免编译错误:

1>. 直接用Xcode5来生成libframework

2>. Xcode6 Build Setting-->Link Frameworks Automatically设置为NO,设置这个之后,Xcode 可能会报更多的错误,因为现在不会自动link框架了,根据报错添加对应的framework即可.

From

framework not found Metal for architecture armv7