9

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

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

A.cpp

MyClass inst;

溴化氢

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

B.cpp

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

现在,当我使用 inst inB.cpp我得到undefined reference to inst.

关于如何解决这个问题的任何想法?

4

4 回答 4

15

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

全局变量(此处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;

而 Ah 看起来像:

#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

希望能帮助到你!

于 2013-07-17T08:22:13.433 回答
0

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

于 2010-09-07T12:37:51.230 回答
0

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

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

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

g++ A.o B.o
于 2010-09-07T12:12:42.410 回答
0

这是一个太简单的例子,无法弄清楚发生了什么。但是,基于上述内容,当它遇到故障线时,编译器完全有可能不知道实际存在什么MyClass,因此无法解析MyClassFunc.

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

于 2010-09-07T12:11:26.243 回答