通常项目中会根据需求引入较多的第三方库,这时因为工程中已经存在很多第三方库了,很有可能两个文件中会有重复定义的问题,报错信息ld: 2 duplicate symbols for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)。如两个文件中两个变量名相同。则报错信息如下(是我在项目里面引入一个第三方SDK时的报错):
duplicate symbol _IPHONE in:
/Users/xhqb/Library/Developer/Xcode/DerivedData/XHQB-dxnbsxlpzmqtxgfkdcyjydtieztp/Build/Intermediates/XHQB.build/Debug-iphoneos/XHQB.build/Objects-normal/armv7/OliveappScreenDisplayHelper.o
/Users/xhqb/Desktop/xhqb-ios/XHQB/ThridLibrary/CopyToYourProject/LivenessDetectionCombineSDK/libOliveappCombineSDK2.a(OliveappDeviceHelper.o)
duplicate symbol _IPOD in:
/Users/xhqb/Library/Developer/Xcode/DerivedData/XHQB-dxnbsxlpzmqtxgfkdcyjydtieztp/Build/Intermediates/XHQB.build/Debug-iphoneos/XHQB.build/Objects-normal/armv7/OliveappScreenDisplayHelper.o
/Users/xhqb/Desktop/xhqb-ios/XHQB/ThridLibrary/CopyToYourProject/LivenessDetectionCombineSDK/libOliveappCombineSDK2.a(OliveappDeviceHelper.o)
ld: 2 duplicate symbols for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
遇见linker command failed with exit code 1 (use -v to see invocation报错后,首先是删掉Build Settings下Other Linker Flags里面的的-ObjC标志,之后编译不在报错。但是删掉后可能会导致其他第三方库报错和不能使用。因为-ObjC和Objective-C的一个重要特性:类别(category)有关。根据解释,Unix的标准静态库实现和Objective-C的动态特性之间有一些冲突:Objective-C没有为每个函数(或者方法)定义链接符号,它只为每个类创建链接符号。这样当在一个静态库中使用类别来扩展已有类的时候,链接器不知道如何把类原有的方法和类别中的方法整合起来,就会导致你调用类别中的方法时,出现"selector not recognized",也就是找不到方法定义的错误。为了解决这个问题,引入了-ObjC标志,它的作用就是将静态库中所有的和对象相关的文件都加载进来。