g ++未定义的引用静态成员变量

时间:2011-10-16 20:21:50

标签: c++ static reference g++ undefined

我正在使用g ++和makefile进行编译。 g ++版本是4.1.2 20080704。

以下是仍包含错误的简化代码:

#ifdef __cplusplus
extern "C" 
{
#endif

 class MyClass
  {
    public:
    MyClass() {};
    MyClass& operator=(MyClass&);
    static MyClass& instance() { return log; };

    private:
    static MyClass log;

  }; 

//MyClass MyClass::log;

int main()
{
  MyClass& myClass = MyClass::instance();
  return 0;
}

#ifdef __cplusplus
} //extern "C" 
#endif

当我使用'g ++ MyClass.cpp'编译时,我收到此错误: '在函数MyClass :: Instance()'中:MyClass.cpp:'对MyClass :: log的未定义引用

如果我使用'g ++ MyClass.cpp -c'编译它构建目标文件,但链接该文件会在链接期间导致相同的错误。我尝试用“MyClass MyClass :: log;”定义静态变量在类定义之后,但由于它在C中编译它,我认为这不会起作用。它给出了一条错误消息“C ++链接与具有C链接的新定义冲突”

我不知道如何解决这个问题,我几天来一直在反对这个问题。非常感谢任何帮助。

额外背景信息:

源自的原始cpp文件包含“必须使用C函数语法的Simulink定义的函数”。我想尽可能少地对现有代码进行更改。我不是C程序员,所以我的理解有限。我知道这些函数正在与simulink一起使用,所有内容都在matlab编译器中编译。我们正在尝试导出simulink创建的内容,以便我们可以将其集成到另一个程序中,但这是我们编译的许多问题之一。希望这能提供更好的背景信息

1 个答案:

答案 0 :(得分:2)

尽管MyClass::log,类定义中的C++声明仍会获得extern "C"链接,因为C中不存在静态类成员。但由于某种原因,类定义之外的MyClass::log的定义得到C链接,这对我来说没有多大意义。

但是你可以通过从extern "C"的范围中删除定义来解决问题。为什么在C ++文件中使用extern "C"呢?