2012-08-15 176 views
0

我的項目有該文件夾結構:困惑C++的#include

Project/ 
--Classes/ 
----Class1.h 
----Class1.cpp 
--main.cpp 

「Class1.h」 載方法的定義, 「Class1.cpp」 是 「Class1.h」 的源代碼。

的 「Class1.h」 的源代碼是這樣的:

​​

的 「Class1.cpp」 的源代碼是這樣的:

#include "Class1.h" 

void Class1::do_something() { 
    // 
} 

的「主要的源代碼的.cpp」是這樣的:

#include "Classes/Class1.h" 

int main(int argc,char** args) { 
    Class1* var = new Class1(); 
    var->do_something(); 
    return 0; 
}  

然而,編譯時‘的main.cpp’,編譯器不知道在柯樂的執行方法s1是,所以它顯示關於未定義參考的鏈接錯誤。

是否必須在命令行中添加任何路徑,以便編譯器知道要編譯的源文件?如何告訴編譯器它也必須編譯「Class1.cpp」?

+0

你使用哪種編譯器? – 2012-08-15 11:01:37

+0

gcc我想,因爲我使用dev C++ ide – jondinham 2012-08-15 11:02:09

+0

你可能想要使用另一個IDE。 AFAIK Dev-C++很久沒有得到支持。拋開,你在「class1.cpp」中包含了「class1.h」嗎? – ApplePie 2012-08-15 11:04:18

回答

2

您需要了解構建(編譯和鏈接)C++應用程序。這個主題通常沒有在關於C++的編程書籍中描述,只有這樣做 - 谷歌和編程社區網站的文章。

快速的回答是:

g++ -c Classes/Class1.cpp -o Class1.o 
g++ -c main.cpp -o main.o 
g++ Class1.0 main.0 -o ProjectName 

這是一個簡單的命令集來編譯和鏈接程序。通常它會由構建系統(make,qmake,cmake,waf,scons,ant等)完成。此外,IDE可以構建無需額外配置的程序,例如Visual Studio。

2

正確的做法是在Class1.cpp文件中包含標題。這樣,如果Class1.cpp被編譯爲庫,則可以使用頭文件來獲取聲明。

反過來,如果你會直接使用Class1.cpp,編譯它你的項目。您應該在您的main.cpp中包含Class1.cpp

5

您需要將項目中的所有文件提供給編譯器,而不僅僅是「main.cpp」。 Here你可以閱讀關於編譯乘法文件和Gcc的基礎知識。

另一種選擇是將你的類編譯爲一個動態庫或靜態庫,但是如果你對庫不是很熟悉的話,你應該先將它們編譯在一起。