iOS工程引入第三方庫報(bào)錯(cuò)linker command failed with exit code 1

通常項(xiàng)目中會(huì)根據(jù)需求引入較多的第三方庫,這時(shí)因?yàn)楣こ讨幸呀?jīng)存在很多第三方庫了,很有可能兩個(gè)文件中會(huì)有重復(fù)定義的問題,報(bào)錯(cuò)信息ld: 2 duplicate symbols for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)。如兩個(gè)文件中兩個(gè)變量名相同。則報(bào)錯(cuò)信息如下(是我在項(xiàng)目里面引入一個(gè)第三方SDK時(shí)的報(bào)錯(cuò)):

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報(bào)錯(cuò)后,首先是刪掉Build Settings下Other Linker Flags里面的的-ObjC標(biāo)志,之后編譯不在報(bào)錯(cuò)。但是刪掉后可能會(huì)導(dǎo)致其他第三方庫報(bào)錯(cuò)和不能使用。因?yàn)?ObjC和Objective-C的一個(gè)重要特性:類別(category)有關(guān)。根據(jù)解釋,Unix的標(biāo)準(zhǔn)靜態(tài)庫實(shí)現(xiàn)和Objective-C的動(dòng)態(tài)特性之間有一些沖突:Objective-C沒有為每個(gè)函數(shù)(或者方法)定義鏈接符號(hào),它只為每個(gè)類創(chuàng)建鏈接符號(hào)。這樣當(dāng)在一個(gè)靜態(tài)庫中使用類別來擴(kuò)展已有類的時(shí)候,鏈接器不知道如何把類原有的方法和類別中的方法整合起來,就會(huì)導(dǎo)致你調(diào)用類別中的方法時(shí),出現(xiàn)"selector not recognized",也就是找不到方法定義的錯(cuò)誤。為了解決這個(gè)問題,引入了-ObjC標(biāo)志,它的作用就是將靜態(tài)庫中所有的和對(duì)象相關(guān)的文件都加載進(jìn)來。


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

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

若重復(fù)的變量名很多,則要挨個(gè)進(jìn)行修改,我目前碰到的情況只有兩個(gè)變量重復(fù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容