2011-04-02 21 views
1

我有三個文件,add.h,add.cpp和TEST.CPP創建和C++

add.h創建一個類的標題使用標題,無非是骨架實施後。

add.cpp包含在add.h

TEST.CPP所列的類的實際代碼中包含的主要方法,並在附加聲明的類的實例,並使用它的一些方法。

但是,我無法編譯它。在add.h,我的#define防止頭的多次寫入,並且在add.cpp和TEST.CPP我已經add.h包括在內,但是當我嘗試使用線

g++ test.cpp -o test 

予編譯在add.h中得到關於未定義的類對象和方法引用的錯誤。我一直在搜索如何編譯或運行這個谷歌,但迄今沒有幫助,StackOverflow可以幫助我嗎?

編輯:對不起,我應該也包含了我曾嘗試G ++ TEST.CPP add.cpp -o測試,它也不能工作,產生相同而導致的錯誤。

+0

如果你的類是模板化的'G ++'並不一定,如果你想保持真實的'encapsulation'玩,很漂亮。如果是這樣的話,你有兩個選擇:1定義頭文件中的所有內容(不容易閱讀)或者兩個,將你的聲明保存在你的頭文件中,然後在結尾處使用(在'#endif'之前) '#include「add.cpp」'並從.cpp文件中刪除'#include「add.h」'。然後嘗試重新編譯test.cpp。 – RageD 2011-04-02 20:37:13

+0

就是這樣。感謝您的解決方案。我創建這個只是爲了解決頭文件和模塊化代碼問題,但是我希望它看起來更復雜一點。 – Nicholas 2011-04-02 20:43:23

回答

5

分別編譯每一個文件,然後鏈接:

g++ -Wall -c test.cpp 
g++ -Wall -c add.cpp 
g++ -o test test.o add.o 

或編譯,並在一個命令鏈接的所有文件:

g++ -Wall -o test test.cpp add.cpp 
+0

我嘗試這兩種方法,我仍然得到相同的錯誤。 test.cpp :(。text + 0x1a4):未定義引用ArrayList :: ArrayList()' – Nicholas 2011-04-02 20:28:53

+0

@Nicholas:這是另一個問題 - 請參閱http://stackoverflow.com/questions/3749099/why-should-the -implementation-and-the-declaration-of-a-template-class-in-the-s – Erik 2011-04-02 20:30:01

2

運行g++ test.cpp add.cpp -o test

編輯:copypasted我在這裏評論

您需要了解爲什麼您的初始方法無法正常工作。當你從test.cpp中的add.h頭文件引用東西時,編譯器會查找定義,但是找不到它們,因爲它們在add.cpp中,而您沒有將它傳遞給編譯器。編譯器不能僅僅因爲在test.cpp中包含add.h就猜測它應該在add.cpp文件中查找定義。

+0

你需要理解你的初始方法不起作用的原因。當你從test.cpp中的add.h頭文件引用東西時,編譯器會查找定義,但是找不到它們,因爲它們在add.cpp中,而您沒有將它傳遞給編譯器。編譯器不能僅僅因爲在test.cpp中包含add.h就猜測它應該在add.cpp文件中查找定義。 – 2011-04-02 20:27:26

+0

我認爲評論應該是答案的一部分。 – LiraNuna 2011-04-02 20:29:16

+0

您的評論和您的編輯混淆編譯器和鏈接器。後者需要'add.cpp'對象代碼,因爲'test.cpp'引用它。 – 2011-04-02 20:56:27

1

你需要

g++ test.cpp app.cpp -o myTest 

app.cpp包含test.cpp使用的代碼。

2

運行g++ test.cpp add.cpp -o test

g++ -c add.cpp -o add.o 
g++ -c test.cpp -o test.o 
g++ test.o add.o -o test 

-c標誌告訴GCC只是編譯並在目標文件中 的最後一步不鏈接 前兩個步驟編譯1個CPP(編譯單元)這些鏈接到一個可執行

您的實際問題來自當你編譯TEST.CPP,它指的是一些simbols這是不確定的事實。 如果你只是編譯(-c標誌)這很好,而下一步就是包含丟失符號的對象文件鏈接。