通常項目中會根據(jù)需求引入較多的第三方庫,這時因為工程中已經(jīng)存在很多第三方庫了,很有可能兩個文件中會有重復(fù)定義的問題,報錯信息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標(biāo)志,之后編譯不在報錯。但是刪掉后可能會導(dǎo)致其他第三方庫報錯和不能使用。因為-ObjC和Objective-C的一個重要特性:類別(category)有關(guān)。根據(jù)解釋,Unix的標(biāo)準(zhǔn)靜態(tài)庫實現(xiàn)和Objective-C的動態(tài)特性之間有一些沖突:Objective-C沒有為每個函數(shù)(或者方法)定義鏈接符號,它只為每個類創(chuàng)建鏈接符號。這樣當(dāng)在一個靜態(tài)庫中使用類別來擴展已有類的時候,鏈接器不知道如何把類原有的方法和類別中的方法整合起來,就會導(dǎo)致你調(diào)用類別中的方法時,出現(xiàn)"selector not recognized",也就是找不到方法定義的錯誤。為了解決這個問題,引入了-ObjC標(biāo)志,它的作用就是將靜態(tài)庫中所有的和對象相關(guān)的文件都加載進來。

由上面可以得知是在將靜態(tài)庫中的所有文件加載進工程進行編譯的時候,靜態(tài)庫中的文件和工程中的文件OliveappScreenDisplayHelper.o在PHONE和IPOD這兩個變量重復(fù)定義了,此時由于靜態(tài)庫中的文件我們看不到而不能做修改,就只能改工程中的文件OliveappScreenDisplayHelper.o,在工程中搜索這個文件,發(fā)現(xiàn)工程中OliveappScreenDisplayHelper.m文件中確實存在這樣的兩個變量。

將兩個變量重新命名之后即可編譯通過。
