2012-07-17 25 views
2

我不知道爲什麼,但經過一段時間的工作沒有問題我加了一些按鈕,然後我開始了我的應用程序,這個錯誤出現了:我有所有的時間運行我的應用程序後,這個問題

ld: duplicate symbol _x in /Users/alexbarco/Library/Developer/Xcode/DerivedData/RecolectaDatos-ayjpqqcajbhuzvbkvernzsyunpbe/Build/Intermediates/RecolectaDatos.build/Debug-iphonesimulator/RecolectaDatos.build/Objects-normal/i386/SeconViewController.o and /Users/alexbarco/Library/Developer/Xcode/DerivedData/RecolectaDatos-ayjpqqcajbhuzvbkvernzsyunpbe/Build/Intermediates/RecolectaDatos.build/Debug-iphonesimulator/RecolectaDatos.build/Objects-normal/i386/ViewController.o for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation)

回答

1

每當我有重複的符號錯誤時,幾乎總是因爲我的標題中有一個循環#import。該解決方案非常簡單,請儘可能使用前向聲明,而使用.m文件中的#import .h文件。

只是有兩種情況下,你需要從另外一個#IMPORT .H:

  1. 如果你在#進口擴展類
  2. 實施在#協議進口

具體來說,您需要導入的文件只是爲了使用您的簽名類名或協議;而是使用前向聲明。

例如,這(在Bar.h):

#import "Foo.h" 

可能成爲本(Bar.h):

@class Foo; 
@protocol FooDelegate; 

和bar.m:

#import "Foo.h" 

這是一個鏈接到the documentation on forward declarations

+0

你是什麼意思與 「使用前聲明」? – alex 2012-07-17 17:26:36

+0

正如我的回答所證明的,Objective-C允許你告訴編譯器一個類或協議「將在運行時存在」,或者基本上「不要抱怨你找不到這個類」。語法非常簡單,只需使用'@class Foo;'告訴編譯器「相信我,那裏*是* Foo這樣的類型,它是一個類」和'@protocol FooDelegate;'說:「相信我,有一個名爲」FooDelegate「的協議,它們允許你在你的方法簽名和@property聲明中使用這些標識符,而不需要#import它們實際存在的文件。 – 2012-07-17 17:29:24

+0

鏈接到文檔添加。 – 2012-07-17 17:34:13

1

「重複符號」消息表示您在同一範圍內聲明瞭兩次相同名稱(本例中爲_x)。假設你有這樣的代碼:

int _x = 1; 
int _x = 2; 

你會期望得到一個錯誤,那麼,對吧?您可以同時爲兩件事物使用相同的名稱。

你得到的錯誤基本上是一樣的。你在某個地方聲明瞭_x,從編譯器的角度來看,你做了兩次。有幾種方法可以解決這個問題,具體取決於_x代表的內容。

chrahey的答案解釋了關於前向類聲明。除了說前向聲明可以幫助您解決循環引用(這裏A類的定義取決於B類,反之亦然)之外,我不會在此再討論它。

如果_x是一個變量,很可能是您試圖在頭文件中聲明它。編譯器基本上將你導入的每個頭文件的內容複製到源文件中,所以如果你在頭文件中聲明瞭一個變量,然後將這個頭文件導入到兩個或多個實現文件中,那麼你最終會得到多個聲明變量。要解決這個問題,使用extern關鍵字來告訴編譯器「這個名字將被宣佈在別處」,然後把真正的聲明在實現文件:

了foo.h:

extern int _x; 

富。m

int _x; 

對功能幾乎是一樣的。它似乎不是_x是一個函數,但如果它是,並且如果你足夠愚蠢可以將函數定義放在頭文件中,那麼如果該文件被導入到多個實現中,則會再次出現錯誤文件。這就是爲什麼頭文件包含的原型,而不是定義:

了foo.h:

int foo(int a); 

Foo.m

int foo(int a) 
{ 
    return a + 10; 
} 
+0

完美。謝謝!我的代碼中有兩個變量。 – alex 2012-07-17 20:38:57

相關問題