常見鏈接錯誤
編譯鏈接的時候報錯税产,算是初學(xué)者遇到的比較頭疼的問題之一了。現(xiàn)在總結(jié)一下洋腮,在項目中遇到了鏈接錯誤烁涌。
1.“OBJC_CLASS$_xx” 錯誤
Undefined symbols for architecture i386:
"OBJC_CLASS$_ASIdentifierManager", referenced from:
objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
分析:看錯誤提示,沒有找到ASIdentifierManager這個文件牺蹄,可能是我們沒有倒入相關(guān)的框架忘伞,或者缺少相應(yīng)的文件(頭文件、實現(xiàn)文件等等)。
解決辦法:我們需要看看工程中有沒有相應(yīng)的實現(xiàn)文件氓奈、頭文件匿刮,或者看看有沒有倒入相關(guān)的框架。
例如本例探颈,缺少了相應(yīng)的框架熟丸,導(dǎo)入AdSupport.framework ,編譯成功伪节。
2.“OBJC_CLASS$_xx” 錯誤
這個看起來跟第一個一樣光羞,但是我們把第一個錯誤中的解決辦法都嘗試了之后,發(fā)現(xiàn)還是編譯不成功怀大,這時候心中就一萬匹草泥馬纱兑,呼嘯而過了。例如:
Undefined symbols for architecture x86_64:
"OBJC_CLASS$_PPAppPlatformKit", referenced from:
objc-class-ref in libPlugin25PP.a(IAPOnline25PP.o)
objc-class-ref in libPlugin25PP.a(PPWrapper.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
死活找不到原因化借,重新閱讀潜慎,相關(guān)的接入文檔,發(fā)現(xiàn)模擬器不能運行蓖康,只有真機才能運行铐炫。認真閱讀接入文檔很關(guān)鍵啊K夂浮5剐拧!
因此 “OBJC_CLASS$_xx” 錯誤泳梆,最后的解決辦法鳖悠,看看是否是要求只能在真機或者模擬器上才能運行。這類錯誤一般再介入別人的sdk的時候比較常見优妙。
3.“duplicate symbol xx”錯誤
分析:字面意思乘综,我們項目中的xx(文件名、類名套硼、全局變量名稱)有重復(fù)出現(xiàn)的情況卡辰。
解決辦法: 仔細察看工程,刪除或者修改熟菲,提示中出現(xiàn)的xx看政。
常見錯誤的情況:同時介入好幾個sdk的時候,不同的sdkyou相同的文件名抄罕,類名,全局變量名等等于颖。因此呆贿,制作sdk的時候,最重要的就是因該再我們的類中,文件中做入,統(tǒng)一加上前綴冒晰,防止別人使用的時候出現(xiàn)沖突。
4."clang: error: -fembed-bitcode is not supported on versions of iOS prior to 6.0" 錯誤
解決辦法:解決辦法:在build setting里面設(shè)置查找“enable_bitcode”,并且改為NO
5.運行時候崩潰竟块『耍“Terminating app due to uncaught exception 'NSGenericException', reason: Collection <__NSArrayM: 0x615c6a0> was mutated while being enumerated”
原因: 遍歷數(shù)組的過程中對它里面的數(shù)據(jù)進行了修改,不能使用for in 或者枚舉器法 遍歷(可以把遍歷的結(jié)果保存下來浪秘,等遍歷完成之后進行修改)蒋情, 因該使用for循環(huán)來進行 。即耸携,我們在遍歷數(shù)組的時候棵癣,不能對它進行修改之類的操作,不然鬼知道會發(fā)生什么事情夺衍。(我理解的大概就是這個意思)
6.在使用c++ 的string類的時候狈谊,出現(xiàn)鏈接錯誤:
分析:看樣子是直接找不到std::string 這個用法了,在我的調(diào)用string類的方法中沟沙,說明使用的這個string庫有問題河劝。所以嘗試解決一下Xcode工程中配置的c++ 的標準庫.
解決辦法:在當前工程的TARGET中在Build Settings搜索lib , 找到C++ Standadr Libary ,libc++(支持c++11的那一個)矛紫,有時候可能是Compiler Default丧裁。然后問題完美解決!
7.Symbol not found: _ NSDictionary0 ___
Referenced from:
/private/var/mobile/Cotainers/Bundle/Applecation/xxxxxx
Expected in:
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
in /private/var/mobile/Containers/Bundle/Applecation/xxxxx
分析:工程中找不到相應(yīng)的系統(tǒng)庫含衔,可能發(fā)生在工程運行在較低版本的手機系統(tǒng)中煎娇,會報錯。
解決辦法: 首先查看贪染,工程中有沒有添加CoreFoundation.frameowrk 缓呛,這個動態(tài)庫,如果有的話杭隙,可以嘗試把CoreFoundation.framework 的Status由Required改為Optional
未完待續(xù)哟绊,希望小伙伴們繼續(xù)補充!