今天使用第三方庫時遇到了duplicate symbol錯誤,調(diào)查后發(fā)現(xiàn)是在Other linker flags的設置 -all_load 導致的。但是刪除該參數(shù)后又導致另一個framework 中的UIView 的category失效了。
上網(wǎng)查明得使用force_load + 路徑來載入framework埋凯。
-force_load $(SRCROOT)/XXXXX/framework/Debug/XXXXX.framework
但是還是編譯不過:
ld: can't map file, errno=22 file '/Users/XXXXX/XXXXX/framework/Debug/XXXXX.framework' for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
在看老外的網(wǎng)站發(fā)現(xiàn)正確的寫法應該是
-force_load $(SRCROOT)/XXXXX/framework/Debug/XXXXX.framework/XXXXX
之后,編譯通過:)
Targets選項下有Other linker flags的設置煞聪,用來填寫XCode的鏈接器參數(shù)雾棺,如:-ObjC -all_load -force_load等膊夹。
Other linker flags設置的值實際上就是ld命令執(zhí)行時后面所加的參數(shù)。
3個常用參數(shù):
-ObjC:加了這個參數(shù)后捌浩,鏈接器就會把靜態(tài)庫中所有的Objective-C類和分類都加載到最后的可執(zhí)行文件中
-all_load:會讓鏈接器把所有找到的目標文件都加載到可執(zhí)行文件中放刨,但是千萬不要隨便使用這個參數(shù)!假如你使用了不止一個靜態(tài)庫文件尸饺,然后又使用了這個參數(shù)进统,那么你很有可能會遇到ld: duplicate symbol錯誤,因為不同的庫文件里面可能會有相同的目標文件浪听,所以建議在遇到-ObjC失效的情況下使用-force_load參數(shù)螟碎。
-force_load:所做的事情跟-all_load其實是一樣的,但是-force_load需要指定要進行全部加載的庫文件的路徑迹栓,這樣的話掉分,你就只是完全加載了一個庫文件,不影響其余庫文件的按需加載