2011-08-16 83 views
5
/me/home/file1.c containes function definition: 

int mine(int i) 
{ 
    /* some stupidity by me */ 
} 

我宣佈使用不同的.c文件的函數(C語言編程101)

/me/home/file1.h 

int mine(int); 

這個功能,如果我想使用此功能mine()/me/home/at/file2.c

這樣做,我所要做的全部是:

file2.c 

#include "../file1.h" 

那夠了嗎?可能不會。

多少這樣做後,當我編譯file2.c,我得到undefined reference to 'mine'

回答

6

您還需要將目標文件從文件1鏈接。例如:

gcc -c file2.c 
gcc -c ../file1.c 
gcc -o program file2.o file1.o 

或者你也可以同時供給的所有文件,並讓GCC做的工作(不建議文件之外的少數);

gcc -o program file1.c file2.c 
+0

謝謝Yann。我如何在Makefile中執行此操作? – hari

+1

一般而言,您只能指定目標文件,而GCC足夠聰明,可以完成剩下的工作。 I.e .:'program:file1.o file2.o \ n \ tgcc -o program file1.o file2.o' –

+0

非常感謝您的及時幫助。 – hari

1

不要在標頭中使用../。相反,指示GCC使用父目錄包括路徑:

(在在目錄):

gcc -I../ -c file2.c 
+0

有時候有很好的理由不這樣做 - 我../,我不會說「不使用../」是一個很好的通用規則。 – George

1

多少這樣做後,當我編譯file2.c中,我得到了一個未定義參考'mine'

不,你不知道。這不是編譯導致這些錯誤。這是另一件事,稱爲「鏈接」。

編譯器編譯一個「翻譯單元」 - 在一個源文件上運行預處理器的結果,可能一次通過#include拉更多的東西,然後鏈接器將它們粘在一起以創建可執行文件。通常,相同的程序既可以作爲編譯器又可以作爲鏈接器,並且具有不同的標誌,通常您可以告訴它一次執行所有操作(並且不會爲編譯的翻譯單元保存任何臨時文件)。但是你需要告訴它鏈接什麼,而且你確實需要編譯所有將要鏈接的東西。

+0

感謝您的詳細解答。 – hari