2014-11-24 27 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