gpt4 book ai didi

c++ - g++ undefined reference 静态成员变量

转载 作者:行者123 更新时间:2023-11-30 04:32:14 25 4
gpt4 key购买 nike

我正在使用 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”编译时,我得到这个错误:'In 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++ - g++ undefined reference 静态成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7787059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com