iOS中如何處理SDK中重復(fù).o文件

 ###  iOS中如何處理SDK中重復(fù).o文件
  1. 在iOS開發(fā)中經(jīng)常會使用到第三方的SDK,有些SDK中有應(yīng)用的相同的類,如下圖所示:Demo工程中有A跟B兩個靜態(tài)庫,A跟B中又有相同的YTLog類


    Demo工程目錄
  2. 該Demo在編譯時會報重復(fù).o文件錯誤,報錯如下圖所示:


    Demo報錯

ld: warning: directory not found for option '-L/Users/z_yt/Desktop/ /Personal_file/5/TestDemo/StaticLibraryDemo/Library'
duplicate symbol OBJC_CLASS$_YTLog in:
/Users/z_yt/Library/Developer/Xcode/DerivedData/StaticLibraryDemoWorkspace-byqglqkcbrjzljfrqjqzzmgrbuvz/Build/Products/Debug-iphonesimulator/libLibraryB.a(YTLog.o)
/Users/z_yt/Library/Developer/Xcode/DerivedData/StaticLibraryDemoWorkspace-byqglqkcbrjzljfrqjqzzmgrbuvz/Build/Products/Debug-iphonesimulator/libLibraryA.a(YTLog.o)
duplicate symbol OBJC_METACLASS$_YTLog in:
/Users/z_yt/Library/Developer/Xcode/DerivedData/StaticLibraryDemoWorkspace-byqglqkcbrjzljfrqjqzzmgrbuvz/Build/Products/Debug-iphonesimulator/libLibraryB.a(YTLog.o)
/Users/z_yt/Library/Developer/Xcode/DerivedData/StaticLibraryDemoWorkspace-byqglqkcbrjzljfrqjqzzmgrbuvz/Build/Products/Debug-iphonesimulator/libLibraryA.a(YTLog.o)
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

  1. 由報錯的信息我們可以很明顯知道LibraryA跟LibraryB中有相同的類沖突,解決這種沖突的最好方法肯定是把其中一個SDK中相同的類修改名稱,但是實際開發(fā)中我們使用的SDK可能是沒有源碼,且也無法修改類名,這時可以通過刪除相同的.o文件來解決這個問題;

  2. 使用lipo命令可以查看到LibraryA的信息,命令為 lipo -info libLibraryA.a,

    lipo查看SDK信息

    由圖可以看出該SDK是no fat file,也就是只有x86_64模擬器版本,如果查看的結(jié)果為fat file,那么還需要做逐一解包的操作,操作命令為lipo LibraryA.a -thin armv7 -output userPath/xxx,userPath/xxx為你想存放的路徑;

  3. 查看libLibraryA.a x86_64包中所包含的文件列表,其操作命令為ar -t libLibraryA.a

    libLibraryA.a x86_64包文件列表

由圖中我們可以看到其中就有YTLog.o文件

  1. 從libLibraryA.a x86_64包中解壓出所包含的文件,其操作命令為ar xv libLibraryA.a
    此處解壓出來的文件是在你的當(dāng)前路徑下(pwd可查看你的當(dāng)前路徑),而不是libLibraryA.a所在的路徑
    libLibraryA.a x86_64解壓出objc file
  1. 刪除YTLog.o文件,rm YTLog.o

  2. 重新打包.a文件,其操作命令為ar rcs libLibraryA.a *.o,執(zhí)行完該命令則會生成一個新的libLibraryA庫

  3. 如果你的庫為fat file的話則每個平臺的包都要執(zhí)行上面6-8的動作,然后再執(zhí)行合并各平臺包的操作lipo -create libLibraryA-armv7.a libLibraryA-armv7s.a libLibraryA-i386.a -output libLibraryA.a

  4. 把重新打包出來的庫導(dǎo)入工程中就可以正常運行起來了;

注意事項

  1. Demo工程中可能有人能夠成功run起來而不用刪除重復(fù)的.o文件,這是因為沒有把兩個sdk中的所有文件導(dǎo)入工程中,要把sdk的所有文件導(dǎo)入工程中要在工程的build Settings中設(shè)置Other Linker Flags,如圖所示


    設(shè)置Other Linker Flags
  2. Other Linker Flags幾個參數(shù) -ObjC -all_load -force_load的意義

-ObjC:加了這個參數(shù)后,編譯器會把靜態(tài)庫中所有的OC類和分類都導(dǎo)入到最后的可執(zhí)行文件中。注意該參數(shù)的O是大寫的。

-all_load:編譯器會把所有找到的目標(biāo)文件都加載到可執(zhí)行文件中。該參數(shù)的出現(xiàn)的是為解決靜態(tài)庫中只有Category時,-Objc參數(shù)失效的bug。但正常情況下不要輕易使用該參數(shù)。要解決-Objc失效的問題也可以使用下面的參數(shù)-force_load。

-force_load:所做的事情跟-all_load是一樣的,但是-force_load要指定需要加載的靜態(tài)庫的文件路徑,這中設(shè)置就可以僅僅完全加載一個庫文件,而不影響其他靜態(tài)庫。

  1. 該方法只能刪除名稱相同且實現(xiàn)相同的類,加入該類僅僅是類名相同,但是實現(xiàn)不一樣,這樣刪除任意一個類都會導(dǎo)致編譯失??;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 系統(tǒng)需求: CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian/Deepin/Al...
    一位先生_閱讀 1,560評論 0 1
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,067評論 0 9
  • 課程小匯報 通過上節(jié)課的了解發(fā)現(xiàn),同學(xué)們目前對基本形的把握還不夠準(zhǔn)確。而這一問題的緣由主要在于觀察方式,所以需要引...
    范佳老師閱讀 243評論 0 0
  • 日行一善簽到 姓名 :張文達 (單位)哈爾濱中央紅小月亮超市有限責(zé)任公司 【日精進打卡第28天】20180422 ...
    文達_心動驛站閱讀 205評論 0 0
  • “李娜,聽說了嗎?以后二胎的產(chǎn)假延長了一個月?!蓖滦』垭娫捀嬖V李娜。 “不錯啊,女人生孩子不容易,就該多休養(yǎng)一段...
    我愛健康閱讀 312評論 1 2

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