未定义的引用静态成员变量
g++ Undefined reference static member variable
我正在使用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"
呢?
相关文章:
- C++:是否可以使用非静态成员变量模板?
- 如何在复杂继承中访问静态成员变量
- 静态成员变量不会由 gettext 转换
- 未使用的C++未优化的静态成员函数/变量
- 为什么我不能像这样在静态成员函数中调用静态成员变量?
- C++ lambda - 捕获静态成员变量
- 多线程处理中的静态成员变量
- 纯标头库中静态成员变量的正确设置器和 getter
- 如何从具有专用化的类模板定义静态成员变量?
- 从静态成员函数访问私有非静态类变量 - C++
- 静态变量与静态成员
- 为什么可以在没有实例变量的情况下访问静态回调方法中的静态成员变量?
- 声明和定义类静态成员变量不会导致多重声明,这是为什么?
- 为什么不允许静态成员变量的初始化在类中,而允许静态静态成员的初始化
- 类中的静态成员变量和C++中的全局变量有什么区别?
- 获取 constexpr 全局变量(不是静态成员)的链接器符号
- C++ 静态成员变量 - 文件之间的访问
- 将非静态成员函数C 的使用无效,而将成员功能作为函数变量
- 如何在运行时使用静态成员函数初始化静态成员变量
- 如何在类静态成员中引用静态变量?