删除预处理器代码时重复符号

时间:2014-11-24 19:42:01

标签: objective-c xcode build

Noob构建问题。

当我改变它时;

#define NOTIFICATION_PLAYBACK_STATE_CHANGED @"SC_NOTIFICATION_PLAYBACK_STATE_CHANGED"

到此;

NSString * const NOTIFICATION_PLAYBACK_STATE_CHANGED = @"SC_NOTIFICATION_PLAYBACK_STATE_CHANGED";

我明白了:

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

752副本的样本:

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

(搜索这个特定的重复符号不会在类的.h和.m文件之外返回任何内容。)

代码中有很多其他地方我在构建过程中用一个没有异议的常量替换了这样的#define。

有人可以猜测这里发生了什么(或者告诉我需要发布哪些信息才能猜到可能)?

正在搜索代码#defines代替#defines,它们已用于创建常量(保留调试/释放defs之类的东西),这是一件愚蠢的事情,即我应该以不同的方式做这件事(如果有的话)?

1 个答案:

答案 0 :(得分:3)

您似乎在头文件中定义了这些常量。头文件被导入到多个其他文件中;因此,在所有这些文件中重复定义。不允许使用相同名称的多个定义。

您想要做的是声明标题中的常量:

extern NSString * const NOTIFICATION_PLAYBACK_STATE_CHANGED;

extern向编译器表明“这是我要使用的名称,但它的存储和定义在别处;让链接器处理”。

然后,在导入标题但不在任何地方导入的文件中,您定义字符串:

NSString * const NOTIFICATION_PLAYBACK_STATE_CHANGED = @"SC_NOTIFICATION_PLAYBACK_STATE_CHANGED";

链接器将找到这个定义,以及extern声明的所有副本,并将它们绑定在一起是相同的。

(如果你依次忽略这些错误,你可能会感兴趣的是你会得到什么错误。你会在一个案例中得到一个编译器错误,一个链接器另一个错误。)