使用extern时未定义的引用

时间:2010-09-07 12:04:34

标签: c++ extern undefined-reference

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

A.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

有关如何解决这个问题的想法吗?

4 个答案:

答案 0 :(得分:10)

我知道这个问题已经过时了,但它仍然对某人有帮助。

对于定义它的编译单元,全局变量(此处:MyClass inst不应该是 extern (此处:{{1 }})

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

  • 单独标题中声明您的全局变量(假设为A.cpp)并使用这些标题在* cpp中包含此标题。
  • 删除定义它们的编译单元的global.h关键字(例如,使用extern):

global.h看起来像:

#ifdef

而A.h看起来像:

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

EXTERN MyClass inst;

和A.cpp:

#ifndef A_H_
#define A_H_

// your header content (without globals)

#endif /* A_H_ */

希望它有所帮助!

答案 1 :(得分:0)

这只是一个例子,可以解决正在发生的事情。但是,基于上述情况,完全有可能当它遇到失败的行时,编译器不知道MyClass中的实际内容,因此无法解析MyClassFunc

我们需要查看MyClass的定义并知道它的确切位置。

答案 2 :(得分:0)

您必须将上述文件A.cpp编译为

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

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

g++ A.o B.o

答案 3 :(得分:0)

从您发布的基本示例代码中我会说您忘记了B.cpp文件中的#include <B.h>