iOS常见编译错误

1、添加一个.a文件到工程中,然后死活编译不过去,提示错误信息:

ld: warning: ignoring file 
/Users/test/Desktop/new31248/shell42/core/lib/Release-iphoneos/libPyConvertlib4Ipad.a, 
file was built for archive which is not the architecture being linked (armv7s): 
/Users/test/Desktop/new31248/shell42/core/lib/Release-iphoneos/libPyConvertlib4Ipad.a
Undefined symbols for architecture armv7s:
  "*******(NSString*)", referenced from:
      -[***** *****:] in *****.o
。。。。。。。
 
ld: symbol(s) not found for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)

用lipo -info 查看.a文件
:input file ******.a is not a fat file
Non-fat file: ******.a is architecture: armv7
说明.a文件只是一个armv7结构,而自己要编译的是要支持armv7和armv7s的fat file,于是可以将architectures属性(保罗release和debug)改为:armv7,这样可以编译过去。


关于Build Active Architecture Only属性

Build Active Architecture Only设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本。而设置为no时,会编译所有的版本。

一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。


这个是设备对应的architecture:
armv6:iPhone 2G/3G,iPod 1G/2G
armv7:iPhone 3GS/4/4s,iPod 3G/4G,iPad 1G/2G/3G
armv7s:iPhone5, iPod5
arm64:iPhone5s

编译出的版本是向下兼容的,比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,但是armv6的设备就不能运行。

armv6、armv7、armv7s是arm CPU的指令集,原则是向下兼容的,如:iPhone4s的CPU支持armv7,但它会兼容armv6,只是使用armv6指令可能无法充分发挥它的特性。iphone5的CPU支持armv7s,它也会兼容armv7。


2. 编译器提示类似file is universal but does not contain a(n) armv6 slice for architecture armv6的错误。可能是您的XCode版本过低,推荐使用4.2以上的版本,将XCodeBuild Settings中的Architectures设置成arm7

3. XCode提示有类似C++语法的错误。可能是您在调用接口时没有设置成OCC++混编模式(具体做法为将调用接口的实现文件改为.mm的后缀)。

4. 提示类似ld: 3 duplicate symbols for architecture i386arm7)的错误。可能是您用了与SDK相同的第三方库,解决方法是删除引起错误的第三方法库的实现文件(.m文件)。

5. 编译器提示类似file is universal (2 slices) but does not contain a(n) armv7s slice:…… for architecture armv7s的错误。是因为此版本的库还不支持arm7s的环境,将Build Settings项中的Valid ArchiteCtures中的arm7s删除即可解决。

6. 编译器提示类似Duplicate symbol _NN_Decode in /Users/…/libPPUserPayKit.a(UPPayRsa_nn.o)  for architecture armv7Command /Developer/…/bin/llvm-g++-4.2 failed with exit code 1的错误。则是因为C++混编模式引起的,您可以将Build Settings 设置项里面的Other Linker Flags设置成空即可。


你可能感兴趣的:(iOS常见编译错误)