2010-06-08 55 views
2

因此,我正在嘗試學習C++,並且儘可能使用頭文件。他們真的對我毫無意義。我試過很多這樣的組合,但沒有迄今已工作:嘗試編譯使用Code :: Blocks的第二個模塊時出現C++鏈接器錯誤

Main.cpp的:

#include "test.h" 

int main() { 
    testClass Player1; 
    return 0; 
} 

test.h:

#ifndef TEST_H_INCLUDED 
#define TEST_H_INCLUDED 
class testClass { 
    private: 
     int health; 
    public: 
     testClass(); 
     ~testClass(); 
     int getHealth(); 
     void setHealth(int inH); 
}; 
#endif // TEST_H_INCLUDED 

TEST.CPP:

#include "test.h" 

testClass::testClass() { health = 100; } 
testClass::~testClass() {} 

int testClass::getHealth() { return(health); } 
void testClass::setHealth(int inH) { health = inH; } 

我想要做的事很簡單,但頭文件的工作方式對我來說根本沒有意義。代碼塊返回上構建如下:

OBJ \調試\ main.o(+的.text 0x131)||在功能main':| *voip*\test\main.cpp |6|undefined reference to的TestClass :: TestClass的()「| ()。testClass()'testClass()'的未定義引用。 || ===構建完成:2個錯誤,0個警告=== |

我很感激任何幫助。或者如果你有一個體面的教程,這也可以(我已經使用的大多數教程都沒有幫助)

回答

3

Code :: Blocks不知道它必須編譯test.cpp並生成一個目標文件test.o(以便後者可以與main.o連接在一起生成可執行文件)。您必須將test.cpp添加到您的項目中。

在Code :: Blocks中,在菜單中選擇Project>Add File,然後選擇您的test.cpp文件。確保選中了Release和Debug複選框。

然後Build->Rebuild

編輯:

這裏有一個技巧,幫助你看到什麼IDE的引擎蓋下編譯時做的事情。轉到Settings -> Compiler and Debugger -> Global Compiler Settings -> Other settings並在Compiler logging下拉框中選擇Full command line。現在,無論何時構建,gcc編譯器命令都將記錄在生成日誌中。每當有人在StackOverflow詢問你使用的gcc命令行時,你可以複製和粘貼生成日誌中的內容。

+0

謝謝你,解決了它。感謝您的提示。 – Karl 2010-06-08 21:00:09

3

你設置標題的方式沒有任何問題。鏈接期間發生錯誤。你的gcc命令行是什麼?我的猜測是你正在編譯main.cpp,並忘記了test.cpp。

+0

我不確定。我只是點擊「構建和運行」。我認爲這會編譯所有文件並自動鏈接它們。我對Codeblocks還沒有非常熟悉,但我認爲你們都是對的。我嘗試過自己構建它,它返回它沒有目標。 – Karl 2010-06-08 20:02:27

0

你用什麼命令來構建?看起來你沒有編譯和鏈接test.cpp,所以當main.cpp尋找合適的符號時,它找不到它們(鏈接失敗)。

0

如在其他答案中所述,這是一個鏈接錯誤。編譯和像這樣的鏈接:

g++ Main.cpp test.cpp -o myprogram -Wall -Werror 
+0

OP使用IDE,而不是命令行。 – 2010-06-08 20:22:50

0

約頭部分(簡介)信息文件了 - 在你的.cpp文件#include行只是指示編譯器在該文件的內容粘貼到流至在那個時候編譯。所以他們讓你在一個地方(test.h)聲明testClass並在很多地方使用它。 (main.cpp,someother.cpp,blah.cpp)。你的test.cpp包含了testClass方法的定義,所以你也需要將它鏈接到最終的可執行文件中。

但是頭文件並沒有什麼魔力,它只是簡單的文本替換而已,爲了方便您不必一次又一次地聲明相同的類或函數。你已經(正確地)在那裏找到了#ifndef TEST_H_INCLUDED的東西,這樣在你有someother.h的機會中,包括test.h和main.cpp #includes test.h和someother.h,你只會得到testClass聲明的單個副本。

希望這會有所幫助!

+0

謝謝你,我很高興聽到我的頭標是正確的。可能只是我不知道如何使用IDE。 – Karl 2010-06-08 20:16:09

相關問題