克++未定义参考静态成员变量(g++ Undefined reference static memb

2019-09-26 05:00发布

我编译这个使用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的::实例()’:MyClass.cpp:“未定义参考MyClass的::日志

如果我编译“克++ MyClass.cpp -c”它建立对象文件,但链接该文件链接期间导致相同的错误。 我试图定义与静态变量“MyClass的MyClass的::登录;” 类定义后,但因为它是编译在C,我不认为这会工作。 它给出了一个错误消息“C ++链接冲突的新的定义与C链接”

我不知道如何解决这个问题,我一直在敲我的头这几天了。 任何帮助是极大的赞赏。

额外的背景信息:

这源自原始CPP文件包含“Simulink的定义的函数,其必须使用C-函数语法”。 我想作出一些改变,尽可能现有的代码。 我不是一个C程序员,所以我理解这里的限制。 我知道,这些职能正在使用Simulink使用一切MATLAB的编译器编译里面。 我们正在尝试导出什么SIMULINK创建,这样我们就可以在另一个程序将其集成,但这是我们编译的诸多问题之一。 希望这提供了一些更好的背景资料

Answer 1:

声明MyClass::log类定义得到C++联动,尽管extern "C" ,因为静态类成员在根本不存在C 。 但由于某些原因,定义MyClass::log外的类定义变得C联动,这没有多大意义的我。

但是你可以从范围移除的定义得到解决此问题extern "C" 。 你为什么要使用extern "C"在C ++反正文件?



文章来源: g++ Undefined reference static member variable