在工程中導入XMPP Framework庫中libidn.a時,出現link錯誤,錯誤以下:code
Undefined symbols for architecture i386:對象
「_iconv」, referenced from:文檔
_mem_cd_iconv in libidn.a(striconv.o) _str_cd_iconv in libidn.a(striconv.o) (maybe you meant: _str_iconv, _str_cd_iconv , _mem_cd_iconv )
「_iconv_close」, referenced from:get
_str_iconv in libidn.a(striconv.o)
「_iconv_open」, referenced from:it
_str_iconv in libidn.a(striconv.o)
ld: symbol(s) not found for architecture i386io
clang: error: linker command failed with exit code 1 (use -v to see invocation)select
起初我覺得是路徑問題,庫文件沒導好。可是反覆檢查發現,不是這樣的。libidn.a這個靜態庫已經在Link Binary With Libraries裏。在網上查了好久的資料,最後在中午的時候想到other linker flags這個參數設置,因而找到發現這個參數設置是-all-load,將它刪除後,再運行無錯誤,問題解決。下午就查了些關於這個參數的一些資料。command
包含靜態庫時候須要在Target的Other linker flags裏面加上值:-objC,-all_load,-force_load 對於64位機子和iPhone OS應用 解決方法是使用-all_load 或者 -force_load。 -all_load強迫連接器從它能看見的全部文檔中加載全部的對象文件,甚至那些沒有OC代碼的文檔。 -force_load適用於Xcode3.2+版本,它容許finer獲得文檔加載的控制。每個-force_load操做必須跟着一個文檔路徑,文檔中的每個對象文件將會被加載。 -all_load就是會加載靜態庫文件中的全部成員, -ObjC就是會加載靜態庫文件中實現一個類或者分類的全部成員, -force_load(包的路徑)就是會加載指定路徑的靜態庫文件中的全部成員。 舉個例子 當連接一個包含類別的OC靜態庫時候,將會獲得一個運行時異常:」selector not recognized」。你須要設置Other Linker Flags的值爲-ObjC就OK了方法