2014-11-24 23 views
1

Noob構建問題。刪除預處理代碼時複製符號

當我改變這個;

#define NOTIFICATION_PLAYBACK_STATE_CHANGED @"SC_NOTIFICATION_PLAYBACK_STATE_CHANGED" 

to this;

NSString * const NOTIFICATION_PLAYBACK_STATE_CHANGED = @"SC_NOTIFICATION_PLAYBACK_STATE_CHANGED"; 

我得到這樣的:752次重複的

ld: 752 duplicate symbols for architecture armv7 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

樣品:

duplicate symbol _NOTIFICATION_PLAYBACK_STATE_CHANGED in: 
    /Users/myname/Library/Developer/Xcode/DerivedData/MyApp-hazegevzmypmbtbnalpiwebrhaea/Build/Intermediates/MyApp.build/Debug-iphoneos/MyApp.build/Objects-normal/armv7/SCRemoteRecordManager.o 
    /Users/myname/Library/Developer/Xcode/DerivedData/MyApp-hazegevzmypmbtbnalpiwebrhaea/Build/Intermediates/MyApp.build/Debug-iphoneos/MyApp.build/Objects-normal/armv7/SCRegisterAcceptTermsViewController.o 
duplicate symbol _NOTIFICATION_PLAYBACK_STATE_CHANGED in: 
    /Users/myname/Library/Developer/Xcode/DerivedData/MyApp-hazegevzmypmbtbnalpiwebrhaea/Build/Intermediates/MyApp.build/Debug-iphoneos/MyApp.build/Objects-normal/armv7/SCRemoteRecordManager.o 
    /Users/myname/Library/Developer/Xcode/DerivedData/MyApp-hazegevzmypmbtbnalpiwebrhaea/Build/Intermediates/MyApp.build/Debug-iphoneos/MyApp.build/Objects-normal/armv7/SCStreamingVideoViewController.o 

(A爲這個特殊的重複符號搜索返回該類自己的.h和外面什麼都沒有。 m文件)。

代碼中有許多其他地方,我已經用這個#define替換了在構建期間沒有反對的常數。

有人可以猜測這裏發生了什麼(或者告訴我需要發佈什麼信息才能進行猜測)?

通過代碼來代替#defines來代替它們被用來創建常量(讓調試/釋放defs未被觸及的東西)做一個愚蠢的事情,即我應該以不同的方式做這件事(如果有的話)?

回答

3

您似乎在頭文件中定義了這些常量。頭文件被導入到多個其他文件;定義因此在所有這些文件中重複。不允許使用相同名稱的多個定義。

你想要做的,而不是什麼是聲明頭中的常數:

extern NSString * const NOTIFICATION_PLAYBACK_STATE_CHANGED; 

extern向編譯器指示:「這是一個名字,我要使用,但存儲和定義因爲它是其他地方;讓鏈接器處理「。

然後,在進口頭,但本身不是任何地方導入的文件,你定義字符串:

NSString * const NOTIFICATION_PLAYBACK_STATE_CHANGED = @"SC_NOTIFICATION_PLAYBACK_STATE_CHANGED"; 

連接器將發現這個定義,以及外部聲明的所有副本,並將它們綁在一起成爲同一件事。

(可能你感興趣,看看你會得到什麼錯誤,如果你省略這些作品又將。您將在一種情況下獲得編譯錯誤,而在另外一個連接錯誤。)

+0

非常簡明扼要的解釋,非常感謝。 – HenryRootTwo 2014-11-25 19:57:18

+0

我很高興你覺得它有幫助! – 2014-11-25 20:06:23