2009-12-06 116 views
0

我正在做C中的一個項目,並且在構建它時遇到問題。它是:建築工程問題C

我在我的項目中有兩個單獨的子系統[A和B]使用另一個子系統[C]的功能。爲此,他們#包括必要的頭文件。其義務是兩個子系統[A和B]必須單獨構建,我的意思是我有兩個獨立的子系統的Makefile,我分別運行'make'。

現在,當我嘗試我的所有子系統[A,B,C]凝聚成一個單一的項目,GCC告訴一些功能已經聲明,這些功能都屬於子系統C.

我意識到,頭文件包含在編譯時,即當我在子系統[A和B]上使用'make'時。所以,當我試圖團結他們時,他們實際上被雙重宣佈。

有人可以幫我解決這個問題嗎?任何解決方案,不需要我將兩個子系統[A和B]編譯在一起將會很好。

+2

很多可能的解釋。請發佈實際的錯誤消息以及導致問題的單個函數的聲明示例。 – 2009-12-06 12:42:21

+0

感謝您的回覆。問題解決了。我在其中一個頭文件中聲明瞭一個靜態變量,在我得到的幾個警告中我沒有看到它。 – 2009-12-08 13:38:01

回答

0

您可以使用#ifndef ..以避免頭文件重包含

#ifndef <some name identifying the header file> 
#define <some name identifying the header file> 
// 
// 

// header file content will go here 

// 

// 
#endif 
+0

僅影響單個編譯單元 – 2009-12-06 12:54:05

+0

另請注意// //不是有效的C註釋。 – Aif 2009-12-06 13:33:46

0

請問你C-頭文件只包含聲明或同時執行?

如果它包含實現,那麼你應該拿出來並單獨編譯它。

3

這是一個編譯錯誤還是一個鏈接錯誤。

如果它是一個編譯時錯誤,則需要使用一些在您的.h文件衛士這樣的:

 
#ifndef FILE_NAME_H 
#define FILE_NAME_H 

// file contents here 

#endif 

這將阻止文件被包含不止一次。更改FILE_NAME_H以反映文件名,以便每個包含警衛都是唯一的。

如果這是一個鏈接時錯誤,這通常發生在頭文件中有函數體(即{})時。由於多個文件將包含頭文件,因此每個文件都會在對象代碼中有自己的定義,這會導致鏈接器衝突。

解決這個問題的最好方法是簡單地確保所有函數體都放在.c文件中。如果它們足夠短,您可以嘗試和,但編譯器不保證聽取您的意見。