1. 程式人生 > >Duplicate Symbol連結錯的原因總結和解決方法

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