2010-09-07 169 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 

希望它能幫助!