【问题标题】:undefined reference when using extern使用外部时未定义的引用
【发布时间】:2011-04-09 04:18:27
【问题描述】:

我有以下设置(希望这不是一个太简单的例子):

啊.h

typedef std::map<unsigned int, float> MyClass;
extern MyClass inst;

A.cpp

MyClass inst;

B.h

#include <A.h>
void foo();

B.cpp

#include <B.h>
void foo {
    inst.myClassFunc();
}

现在,当我在 B.cpp 中使用 inst 时,我得到了 undefined reference to inst

知道如何解决这个问题吗?

【问题讨论】:

  • 你在 B.cpp 中#include class MyClass 的定义吗?
  • 您应该在帖子中包含完整的编译器错误消息。

标签: c++ extern undefined-reference


【解决方案1】:

我知道这个问题很老,但它仍然可能对某人有所帮助。

全局变量(这里:MyClass inst不应该是 extern 对于定义它的编译单元(这里:A.cpp

实现此目的的一种方法:

  • 单独的标头(比如global.h)中声明您的全局变量,并使用这些将这个标头包含在 *cpp 中。
  • 删除定义它们的编译单元的extern关键字(例如使用#ifdef):

global.h 看起来像:

#ifdef A_H_
  #define EXTERN
#else
  #define EXTERN extern
#endif

EXTERN MyClass inst;

而 A.h 看起来像:

#ifndef A_H_
#define A_H_

// your header content (without globals)

#endif /* A_H_ */

和 A.cpp:

#include "A.h"
#include "global.h" // after A.h inclusion, we need A_H_ definition

希望对你有帮助!

【讨论】:

    【解决方案2】:

    这是一个太简单的例子,无法弄清楚发生了什么。然而,基于上述情况,当它遇到失败行时,编译器完全有可能不知道MyClass 中的实际内容,因此无法解析MyClassFunc

    我们需要查看 MyClass 的定义并确定它在哪里回答。

    【讨论】:

      【解决方案3】:

      你必须把上面提到的文件A.cpp编译为

      g++ -c A.cpp
      g++ -c B.cpp
      

      然后在创建可执行文件时,您应该编写如下命令:

      g++ A.o B.o
      

      【讨论】:

      • 或者一步,g++ A.cpp B.cpp
      【解决方案4】:

      根据您发布的基本示例代码,我想说您忘记了 B.cpp 文件中的 #include &lt;B.h&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-28
        • 1970-01-01
        • 2013-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        • 2022-01-16
        相关资源
        最近更新 更多