ld:重复符号 - 由const引起

时间:2012-03-06 12:11:51

标签: objective-c c const linker-errors c-preprocessor

我在NSError中定义了一个NSString用作错误域,并且正在复制ASIHttpRequest在那里做的事情。

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";

我把const放在自己的.h文件中     // FPServerAPICoordinatorConstants.h

#ifndef FirePlayer_FPServerAPICoordinatorConstants_h
#define FirePlayer_FPServerAPICoordinatorConstants_h

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";

#endif

但是当我把它包含在多个.m

中时
SomeFile.m

#import "FPServerAPICoordinatorConstants.h"

SomeOtherFile.m

#import "FPServerAPICoordinatorConstants.h"

我收到链接器错误'重复符号'

ld: duplicate symbol _FPServerAPIErrorDomain in SomeFile.o and ....SomeOtherFile.o for architecture armv7

所以我将const更改为#define,它运行正常。

//  FPServerAPICoordinatorConstants.h

#ifndef FirePlayer_FPServerAPICoordinatorConstants_h
#define FirePlayer_FPServerAPICoordinatorConstants_h


//THIS WAS TRIGGERING link errors
//NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";
//working OK
#define FPServerAPIErrorDomain @"FPServerAPIErrorDomain"

#endif

但是有没有办法让const在全局空间中不要抛出'重复符号'?

3 个答案:

答案 0 :(得分:51)

在您想要的标题文件中:

extern NSString *const FPServerAPIErrorDomain;

然后在一个实现文件中(所以你可能需要一个FPServerAPICoordinatorConstants.m),你会想要:

NSString *const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain";

然后,您可以将标头导入多个文件,但不会出现重复的符号错误。

[顺便说一句,如果您使用#ifndef,则不需要#import警卫。]

答案 1 :(得分:3)

无法在同一名称空间中两次实例化相同的(全局)变量(不会出现错误)。

答案 2 :(得分:1)

每个符号只应定义一次;也就是说,它应该只在一个m文件中定义。通过将定义放在头文件中,它将在包含该头文件的每个m文件中定义。

在你的一个m文件中定义它(以最相关的方式),并将标题中的内容更改为声明(使用extern关键字)。

该定义为数据腾出空间;声明只是告诉编译器在其他地方有一个定义。因此,每个使用常量的m文件都需要声明,但只有一个m文件应该有定义。