2011-10-10 157 views
4

所以我有這個奇怪的問題:當我導入一個單獨的類的.h文件時,我非常基本的程序會生成一個錯誤消息(未定義引用'foo :: foo(int)')。但是,當我將導入文件更改爲.cpp時,它一切正常。#include .h或.cpp文件?

現在,我已經讀了一些,看過一些視頻教程,他們都這樣說:導入.h文件。那爲什麼它不工作?

我使用Code :: Blocks,在Windows 7中編譯和運行(無命令行)。我確實懷疑某些東西設置不正確,但是我確實想知道它是否可以是我的代碼失敗了。

Main.cpp的:

#include <iostream> 
#include "Foo.h" //This don't work. If i include Foo.cpp it does. 

using namespace std; 

int main() 
{ 
    Foo k(10); 
    cout << k.getInt() << endl; 
} 

了foo.h:

#ifndef FOO_H 
#define FOO_H 

class Foo 
{ 
    public: 
     Foo(int tall); 
     int getInt()const; 
    protected: 
    private: 
     int m; 
}; 

#endif 

Foo.cpp中:

#include "Foo.h" 

Foo::Foo(int tall) 
: m(tall) 
{ 
    //ctor 
} 

int Foo::getInt()const 
{ 
    return m; 
} 
+7

可能是最好的拿起了一本書,並開始逐漸熟悉的基礎知識! 1)你的程序不會產生錯誤,你的編譯器會這樣做。 2)它不是編譯錯誤,而是鏈接錯誤。 3)你不「導入」頭文件,你*包括*它。 4)瞭解翻譯單元,模塊化編譯和鏈接。 –

+2

好吧,我意識到我寫這篇文章有點太快了。我確實知道這是編譯器產生的錯誤,我可以猜到第二點(對連接還不太熟悉),第三點只是一個錯誤類型 - 我的第一語言是Java。不過,第四點似乎確實是個好主意。 謝謝。 – MartinHaTh

+0

@MartinHaTh:關鍵的區別在於Java的'import'真的*導入*模塊併爲您找到所有相關文件,而在C++中,您所做的只是* include *文件的內容,頭文件*文件 - 你仍然需要自己執行鏈接。所以術語的區別不僅僅在於恰當。 –

回答

1

您需要編譯main.cppfoo.cpp並將兩個生成的目標文件鏈接在一起。

+1

我猜Code :: Blocks應該自動執行 –

+1

@AlessandroPezzato我只是在Code :: Blocks上搜索,似乎IDE應該照顧所有這些。也許OP創建了一個空項目,這樣嚮導就不會創建任何設置。 – Praetorian

+0

嗯,我想這可能是我的錯。我創建了一個空白文件(只是爲了不獲取.h文件),並將其命名爲Main.cpp。然後,在編寫該類之後,我創建了一個新類,它創建了cpp和頭文件。這可能是問題所在。 好的,我可以證實這是問題所在。現在一切正常。男人,我很傻... – MartinHaTh

1

你無法編譯和/或鏈接Foo.cpp中文件,當你做你的鏈接步驟。我不熟悉Code :: Blocks,所以我不能告訴你如何解決它。

0

右鍵單擊您的.cpp文件並轉到屬性。在構建選項卡上,確保編譯,鏈接,調試和發佈被選中。

enter image description here

+0

這是什麼操作系統?它看起來像Debian – Arc676

+0

@ Arc676我認爲這是Arch with xfce。 – Pubby

+0

Arch是否有控制檯界面?Raspberry Pi OS「Raspbian」(Debian版本)啓動到控制檯並需要終端命令來激活GUI。我下載了Debian,但它唯一的控制檯界面是恢復控制檯。 Arch是否有類似的界面? – Arc676