使用Xcode编译C ++代码时出现问题

时间:2011-02-28 20:57:25

标签: c++ xcode static

我试图在Xcode中编译一些C ++代码,我收到了这个错误:

Undefined symbols:
  "Editorial::sm_nTotalEditorials", referenced from:
      Editorial::AskTotal()     in editorial.o
      Editorial::~Editorial()in editorial.o
      Editorial::~Editorial()in editorial.o

下面是另外两个析构函数条目和另外四个构造函数条目(我相信这是我使用sm_nTotalEditorials的唯一函数)。我附上了变量的定义和我使用它的函数。

class Editorial
{
private:
     static int         sm_nTotalEditorials;
     ...
}

int Editorial::AskTotal() {return sm_nTotalEditorials;}

Editorial::~Editorial()
{
    if (!m_pPrev) sm_pFirstEditorial=m_pNext;
    if (m_pPrev) (*m_pPrev).SetContext((*m_pPrev).AskPrev(),m_pNext);
    if (m_pNext) (*m_pNext).SetContext(m_pPrev,(*m_pNext).AskNext());
    sm_nTotalEditorials--;
}

然后它打印出与我正在使用的其他3个静态私有变量类似的错误。我一定是搞乱了静态用法。这是我的第一个C ++代码,所以我为任何错误的语法道歉或者问题太愚蠢了;我试着在互联网上搜索,但Xcode打印的错误很模糊,根据我看过的教程,我正在使用它应该使用的所有内容。此外,打印所有内容的代码都很长,而且我将这些部分粘贴在我认为错误的位置,但我也不确定。

2 个答案:

答案 0 :(得分:1)

在C ++中,为类创建静态数据成员需要两个步骤。首先,你必须声明你在这里完成的变量。但是,您还必须在某处定义它,以便编译器知道将变量的存储空间放在何处。通常,这是在类的.cpp文件中完成的。在.cpp文件中,尝试添加以下行:

int Editorial::sm_nTotalEditorials = 0;

这为编译器提供了所需的定义,因此您不会再有任何链接器错误抱怨缺少定义。您也可能希望为其他静态数据成员执行此操作。

请注意,在制作这些类型的定义时,不要重复使用static关键字;这将给静态字段静态链接,这将无法解决问题。

答案 1 :(得分:0)

它是作为c ++代码编译的吗?我记得读过该文件需要一个.mm扩展名来区分obj-c。 "获取信息"还有一个文件类型下拉列表。 Xcode中文件的页面。