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

g++ Undefined reference static member variable

本文关键字:变量 静态成员 引用 未定义      更新时间:2023-10-16

我正在使用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"编译时,我得到这个错误:' Function MyClass::Instance()': MyClass.cpp: '对MyClass::log的未定义引用

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

我不知道如何解决这个问题,我已经绞尽脑汁想了好几天了。如有任何帮助,不胜感激。

附加背景信息:

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

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

但是您可以通过从extern "C"的作用域中删除定义来解决这个问题。为什么要在c++文件中使用extern "C"呢?