2010-09-07 170 views
5

我具有以下设置(希望这不是太裸露为例):未定义参考

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

A.cpp

MyClass inst; 

Bh

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

B.cpp

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

现在,当我在B.cpp使用出师表我得到undefined reference to inst

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

+0

你是否在B.cpp中包含'class MyClass'的定义? – 2010-09-07 12:12:59

+0

你应该在你的文章中包含完整的编译器错误信息。 – 2010-09-07 12:36:25

回答

0

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

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

+0

已更新关于'MyClass' – 2010-09-07 12:27:30

0

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

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

,然后在创建可执行如下,你应该写命令:

g++ A.o B.o 
+1

或在一个步骤中,'g ++ A.cpp B.cpp'。 – 2010-09-07 13:02:46

0

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

9

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

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

一种方式来实现这一目标:

  • 声明你的全球变量在一个单独的标题(比方说global.h),并在* cpp使用SE。
  • 除去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 

希望它能帮助!