使用extern时未定义的引用

Ami*_*hum 5 c++ extern undefined-reference

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

啊

typedef std::map<unsigned int, float> MyClass;
extern MyClass inst;
Run Code Online (Sandbox Code Playgroud)

A.cpp

MyClass inst;
Run Code Online (Sandbox Code Playgroud)

BH

#include <A.h>
void foo();
Run Code Online (Sandbox Code Playgroud)

B.cpp

#include <B.h>
void foo {
    inst.myClassFunc();
}
Run Code Online (Sandbox Code Playgroud)

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

有关如何解决此问题的任何想法?

joh*_*n d 11

我知道这个问题很老,但它对某些人来说仍然有用.

全局变量(此处MyClass inst)不应该 extern 对编译单元,其定义它(这里A.cpp)

实现这一目标的一种方法:

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

global.h看起来像:

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

EXTERN MyClass inst;
Run Code Online (Sandbox Code Playgroud)

而阿看起来像:

#ifndef A_H_
#define A_H_

// your header content (without globals)

#endif /* A_H_ */
Run Code Online (Sandbox Code Playgroud)

和A.cpp:

#include "A.h"
#include "global.h" // after A.h inclusion, we need A_H_ definition
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!


Ste*_*end 0

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

我们需要查看 MyClass 的定义并知道它在哪里可以确定答案。