【问题标题】:g++ Undefined reference static member variableg++ 未定义的引用静态成员变量
【发布时间】:2011-10-16 20:21:50
【问题描述】:

我正在使用 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 创建的内容,以便我们可以将其集成到另一个程序中,但这是我们编译的众多问题之一。希望这能提供一些更好的背景信息

【问题讨论】:

  • 你为什么要首先尝试给 C 类链接..?
  • 从其派生的原始 cpp 文件包含“必须使用 C 函数语法的 Simulink 定义的函数”。我想对现有代码进行尽可能少的更改。我不是 C 程序员,所以在这里我的理解有限。我确实知道这些函数正在与 simulink 一起使用,并且所有内容都在 matlab 编译器中编译。我们正在尝试导出 simulink 创建的内容,以便我们可以将其集成到另一个程序中,但这是我们编译的众多问题之一。希望这能提供一些更好的背景信息。
  • 这不是一个重复的问题——extern "C" 链接的问题是新的。投票重新开放。

标签: c++ static reference g++ undefined


【解决方案1】:

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

但是您可以通过从extern "C" 的范围中删除定义来解决此问题。你为什么要在 C++ 文件中使用extern "C"

【讨论】:

    猜你喜欢
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2021-12-13
    相关资源
    最近更新 更多