Duplicate Symbol連結錯的原因總結和解決方法
DuplicateSymbol連結錯的原因總結和解決方法 http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73261868d462e8ec814c0735b36163bbca67772511993922f3116af3e1eb0b2217343457be18cc9fe49d8be94232f9c6269304a8917559147f49a15639637902ba8e446b7e7ae&p=aa798e5985cc43be08e2947d0e4a80&newp=8b2a9717ce981dff57ed977d4d089e231610db2151d4d1166b82c825d7331b001c3bbfb423231606d7c67c6000ab4858eef03278310025a3dda5c91d9fb4c57479da3f6f2c&user=baidu&fm=sc&query=duplicate+symbol&qid=e2b5593d000150d7&p1=1 duplicatesymbol是一種常見的連結錯誤,不像編譯錯誤那樣可以直接定位到問題的所在。但是經過一段時間的總結,發現這種錯誤總是有一些規律可以找的。 例如,我們有如下的最簡單的兩個類程式碼: // ClassA.h #import <Foundation/Foundation.h> @interface ClassA : NSObject @end // ClassA.m #import "ClassA.h" @implementation ClassA @end // ClassB.h #import <Foundation/Foundation.h> @interface ClassB : NSObject @end // ClassB.m #import "ClassB.h” @implementation ClassB @end 編譯後出現的錯誤資訊如下: duplicatesymbol _OBJC_METACLASS_$_ClassA in: /Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o /Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.o duplicatesymbol _OBJC_CLASS_$_ClassA in: /Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassA.o /Users/dajie/Library/Developer/Xcode/DerivedData/linkTest-cpjaaatiyqpvxcbzfzpklcbqrgqg/Build/Intermediates/linkTest.build/Debug-iphonesimulator/linkTest.build/Objects-normal/i386/ClassB.old: 2 duplicate symbols for architecture i386clang: error: linker command failed with exit code 1 (use -v to see invocation) 從上面出現問題的地方,我們應該能推測出是ClassA這個類出了問題。如果這個類是我們自己寫的,就容易辦一些。 可以考慮以下原因: 1.引入標頭檔案時,由於疏忽,誤引入.m檔案。這種一般仔細檢查一下出現問題的類的原始檔就能發現。 例:ClassB.m 檔案修改成下面這樣 #import "ClassB.h>" #import "ClassA.m” // 這句話有問題 @implementation ClassB @end 2.同一個類,實現兩次,即有兩個@implementation 。這種一般會有一個警告,也比較容易發現。 例:ClassB.m檔案修改成下面這樣: // ClassB.m #import "ClassB.h” @implementation ClassB @end @implementation ClassA @end 3.工程檔案,同一個類檔案被引入了兩次,引起這種錯誤的原因大概有兩種:一是多人協作開發時,導致project檔案合併衝突;二是同名檔案不在同一目錄下,新增到工程時造成重複新增。 這種一般在檔案檢視,用名字過濾器檢查一下就發現了。 4. Targets的Build Phase設定項裡,檢視Complie Sources這一項,看看出現問題的類是不是有重複的,用檔名過濾也比較容易發現。這種問題一般也是多人協作開發時,project檔案衝突導致的。發現這種問題,只要刪除就可以了。不過在我解決問題過程中,刪除其中一個檔案時,重複檔案會自動全部刪除,所以還需要單獨新增一下。 5.如果我們的工程中引用了第三方的庫,而恰好第三方的庫裡面有一個ClassA,也會出現這種問題。如果不能修改第三方的庫程式碼,只能修改我信自己的程式碼了。 歡迎補充。 http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73261868d462e8ec814c0735b36163bbca67772511993922f3116af3e1eb0b2217343457be18cc9fe49d8be94232f9c6269304a8917559147f49a15639637902ba8e446b7e7ae&p=aa798e5985cc43be08e2947d0e4a80&newp=8b2a9717ce981dff57ed977d4d089e231610db2151d4d1166b82c825d7331b001c3bbfb423231606d7c67c6000ab4858eef03278310025a3dda5c91d9fb4c57479da3f6f2c&user=baidu&fm=sc&query=duplicate+symbol&qid=e2b5593d000150d7&p1=1 |