【问题标题】:Duplicate symbol error — global constant重复符号错误 - 全局常量
【发布时间】:2012-06-13 00:04:43
【问题描述】:

在类的头部,接口声明之外,我声明了全局常量:

NSString * const gotFilePathNotification = @"gotFilePath";
NSString * const gotResultNotification = @"gotResultOfType";

gotResultNotification 仅在此类中使用(目前),但我在另一个类实现中引用了 gotFilePathNotificaion。为此,我导入了此标头。

当我尝试编译时,我在此标头中收到有关 gotFilePathNotification 的重复符号链接器错误。为什么会这样?

【问题讨论】:

    标签: objective-c linker compiler-errors constants


    【解决方案1】:

    还要确保包含 h 文件而不是 m 文件。这让我发疯了。

    【讨论】:

      【解决方案2】:

      你需要在头文件中声明它们extern并在实现文件中定义它们。请参阅此问题以进行澄清。 Global Variables in Cocoa/Objective-C?.

      第二个回复提供了我将在此重申的说明。变量的默认存储限定符是静态的。这意味着当您尝试使用相同的变量链接两个不同的文件时,正如您导入头文件时会发生的那样,链接器将认为该变量是多重定义的。

      【讨论】:

      • 默认存储限定符是静态的。如果是,那么您将不会遇到链接器错误。静态变量具有内部链接。所以,如果两个翻译单元都定义了一个具有相同标识符的静态变量,那么它们每个都有一个单独的变量。
      【解决方案3】:

      您在文件范围内的两个不同编译单元中有两个同名的标识符。这违反了One Definition Rule。相反,您需要 -

      1. 在头文件中声明全局变量标记为具有外部链接。

        extern NSString * const gotFilePathNotification;
        
      2. 现在在一个源文件中提供定义。

        NSString * const gotFilePathNotification = @"gotFilePath";
        

      现在,无论您需要在哪里使用这些变量,都可以在源文件中包含标头。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        • 1970-01-01
        • 1970-01-01
        • 2021-03-11
        • 2013-06-13
        相关资源
        最近更新 更多