2013-03-22 24 views
19

我遇到的問題是,當我爲創建的類調用構造函數時,出現以下錯誤。對類構造函數的未定義引用,包括.cpp文件修復程序

main.cpp中:20:未定義參照 '

這個問題可以' 固定 `StaticObject :: StaticObject(圖形*,SF ::字符串,
SF :: Vector2) '在main.cpp中爲.cpp文件添加一個include就像這樣。

... 
#include "GameObjects/StaticObject.cpp" 
... 

雖然這解決了這個問題,但這似乎是一個糟糕的解決方案,違背了我以前的說法。有沒有其他辦法可以解決這個問題?我使用Netbeans 7.3和g ++來編寫/編譯這個程序。以下是相關的代碼。

的main.cpp

... 

#include <SFML/Graphics.hpp> 
#include "Graphics/Graphics.hpp" 
#include "GameObjects/StaticObject.hpp" 

int main(int argc, char** argv) { 

    //SETUP 
    Graphics graphics; 

    background = new StaticObject(&graphics, "Data/Images/BackgroundPlaceholder.png", sf::Vector2f(0,0)); 

... 

main.hpp

... 

#include <SFML/Graphics.hpp> 
#include "GameObjects/StaticObject.hpp" 

... 

// Objects 
StaticObject *background; 
... 

StaticObject.hpp

#include <SFML/Graphics.hpp> 
#include "../Graphics/Graphics.hpp" 

class StaticObject{ 
public: 
    StaticObject(); 
    StaticObject(Graphics *_graphics, sf::String texture_filename, sf::Vector2f _position); 
    StaticObject(const StaticObject& orig); 
    virtual ~StaticObject(); 
private: 
    // The sprite stores the position 
    sf::Sprite *sprite; 
    sf::Texture *texture; 
}; 

StaticObject.cpp

#include "StaticObject.hpp" 
#include <SFML/Graphics.hpp> 
#include "../Graphics/Graphics.hpp" 

StaticObject::StaticObject(){  
} 

StaticObject::StaticObject(Graphics *_graphics, sf::String texture_filename, sf::Vector2f _position) { 
    sprite = _graphics->AddSprite(texture_filename); 
    sprite->setPosition(_position); 
} 

StaticObject::StaticObject(const StaticObject& orig) { 
} 

StaticObject::~StaticObject() { 
} 

如果我添加以下行main.cpp中,錯誤消失。

#include "GameObject/StaticObject.cpp" 

任何人都可以請解釋:

  1. 爲什麼這能解決問題?

  2. 爲什麼.cpp並未通過包含.hpp 文件而隱式包含?

  3. 有沒有更好的方法來做到這一點?

+1

是包含在您的項目中的GameObject/StaticObject.cpp?看起來不像是從錯誤 – bizzehdee 2013-03-22 20:21:49

+0

'你在項目中'是什麼意思?如上所述,使用#include似乎可以解決問題,但必須有更好的方法。謝謝你的方式:) – OMGtechy 2013-03-22 20:24:22

+3

不要包含cpp,編譯它並鏈接到目標文件。 – chris 2013-03-22 20:24:24

回答

14

undefined reference錯誤表明鏈接器找不到函數/方法(即構造函數)的定義。

StaticObject::StaticObject(Graphics*, sf::String, sf::Vector2<float>) 

而且,添加以下行的原因:

#include "GameObject/StaticObject.cpp" 

修復的問題,是在實施帶來的main.cpp的一部分,而你的實際執行是StaticObject.cpp。這是一個錯誤的方法來解決這個問題。

我還沒有使用Netbeans,但應該有一個選項來將所有.cpp文件添加到一個項目中,以便Netbeans負責將所有.o文件鏈接到一個可執行文件中。

如果StaticObject.cpp被內置到它自己的庫中(我非常懷疑這是這種情況),那麼您可能必須指定該庫的位置路徑,以便鏈接器可以找到實現。

這是當你建立你的計劃是什麼理想的情況:

Compile: StaticObject.cpp -> StaticObject.o 
Compile: main.cpp -> main.o 
Link: StaticObject.o, main.o -> main_program 

雖然有辦法GCC/G ++跳過所有中間的.o文件幾代直接生成main_program,如果指定的所有源文件(和任何庫)在同一命令行中。

+0

謝謝! :)不知何故,StaticObject文件已經從項目中刪除了自己。重新添加並解決問題! – OMGtechy 2013-03-22 20:30:32

2

鏈接器找不到StaticObject的定義,這意味着您沒有編譯和鏈接StaticObject.cpp。每個.cpp文件需要單獨編譯,並且編譯器爲每個文件生成的對象文件需要提供給鏈接器。

在Main.cpp中包含StaticObject.cpp的原因是您要告訴預處理器將StaticObject.cpp的內容插入您正在編譯的Main.cpp中,因此這些定義成爲Main.cpp編譯的一部分輸出。

2

我不太瞭解netbeans,但可能GameObject/StaticObject.cpp不作爲要編譯的源的一部分。

這就是爲什麼如果你在main.cpp手動包含它,他發現源代碼,一切都很好。

3

包括cpp文件使編譯器構建代碼爲文件(你不應該這樣做)的一部分,你需要做的就是編譯遊戲對象/ StaticObject.cpp文件作爲自己的目標是什麼,並鏈接2個物體在一起。

0

我有同樣的問題,但我的是因爲我使用Eclipse CDT和Autotools項目。所以我不得不手動添加新的.h.cpp文件到相應的Makefile.am,然後做一個項目>重新配置項目,重建,就是這樣。