我正在使用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创建的内容,以便我们可以将其集成到另一个程序中,但这是我们编译的许多问题之一。希望这能提供更好的背景信息
答案 0 :(得分:2)
尽管MyClass::log
,类定义中的C++
声明仍会获得extern "C"
链接,因为C
中不存在静态类成员。但由于某种原因,类定义之外的MyClass::log
的定义得到C
链接,这对我来说没有多大意义。
但是你可以通过从extern "C"
的范围中删除定义来解决问题。为什么在C ++文件中使用extern "C"
呢?