我正在使用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"
呢?