【问题标题】:C++ Duplicate Symbol error when defining static class variable in XCode在 XCode 中定义静态类变量时出现 C++ 重复符号错误
【发布时间】:2009-12-07 08:15:03
【问题描述】:

我在构造函数中增加了一个静态类成员。根据规则,它在类中声明并在外部定义。这应该是完全合法的。任何想法为什么我会收到重复的符号错误?

class Player
{
   private:
      static int numPlayers;
   public:
      Player() { numPlayers++; }
};

int Player::numPlayers = 0;

【问题讨论】:

  • P.S.这都在一个 .cpp 文件中。没有单独的头文件。
  • 我不禁想知道是否有一些构建设置、标志或项目设置正在扼杀这个。我刚刚在一个空白的 Cocoa 项目中对其进行了测试,它工作得很好。奇怪。

标签: c++ xcode static-members duplicate-symbol


【解决方案1】:

问题在于您没有将您的声明与定义分开。考虑:

类播放器 { 私人的: 静态 int numPlayers; 民众: 播放器() { numPlayers++; } };

上面的代码只是在“Player”类中声明了“numPlayers”的存在。但是,它不保留任何空间或将内存地址分配给变量“Player::numPlayers”。然而:

int Player::numPlayers = 0;

上面的代码是一个定义——它为对象 Player::numPlayers 保留空间并为该对象指定一个唯一的地址。该行在程序中多次出现违反了单一定义规则。现在最有可能发生的是您正在包含此文件...

您永远不应包含“.c”、“.cpp”、“.m”、“.mm”或任何其他“源”文件(即包含定义的文件)。您应该只包含“头”文件(即包含纯粹声明的文件)。对于包括 Xcode 在内的许多构建系统,每个源文件都会自动编译并链接到项目中。如果您包含来自另一个源文件的源文件,那么定义会被链接两次——第一次是在它自己编译时,然后在另一个源文件引用它时再次链接。

既然您询问的是 Xcode……您可以通过在项目详细信息视图中取消选中源文件来解决此问题;源文件旁边的复选标记表示它将为当前目标编译和链接。但是,我强烈建议您保持“.mm”文件处于选中状态,创建一个“.h”文件来放置您的声明,并包含“.h”文件而不是包含另一个源文件。

【讨论】:

  • 你说得对,迈克尔。定义和声明需要分开。该程序最初是一个独立的 .cpp。然后我将它集成到 Cocoa 应用程序中,直到现在.cpp 的#include 没有任何问题。但现在我知道了! Muchimas Gracimus
【解决方案2】:

你定义了多次吗?即在头文件中定义并包含在多个cpp文件中。

【讨论】:

  • 谢谢,aj。我不知道你有没有看到我的“P.S.”,但我没有这个的 .h。但是,我确实有其他可能包含它的 .mm 文件。会检查。 ÷D
  • 哎呀!它在xcode中就是它。但我相信概念保持不变。只需检查您是否包含多次。
  • 刚刚检查过。 Objective-C 类的另一个头文件#includes 它,但我从 Obj-C 调用 C++ 代码没有任何问题。还有其他想法吗?
  • 我在 Xcode 中用一个新项目对此进行了测试,它编译得很好,所以是的,我猜它是在别处定义的。
  • 谢谢大家,但我已经在项目范围内进行了搜索,但无处可寻。很奇怪。看起来像一个 GITM。
猜你喜欢
  • 2018-07-31
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 2013-07-16
  • 1970-01-01
相关资源
最近更新 更多