2011-09-24 25 views
2

這真是一個新手問題。我正在學習C,並且我不知道如何將不同的文件鏈接到一起 。gcc連接器如何在包含文件中工作

我有一個像

/* file2.h */ 

int increment(int x); 

頁眉和C文件

/* file2.c */ 

#include "file2.h" 

int increment(int x) 
{ 
    return x+1; 
} 

現在我想包括在file1.c頭,以使用功能increment。 從我明白我必須做一些事情,如:

/* file1.c*/ 

#include "file2.h" 

int main() 
{ 
    int y = increment(1); 
    return 0; 
} 

但是,當我嘗試編譯整個事情,使用

​​

我得到這樣

/tmp/ccDdiWyO.o: In function `main': 
file1.c:(.text+0xe): undefined reference to `increment' 
collect2: ld returned 1 exit status 
的錯誤信息

但是,如果我還包括file2.c

/* file1.c*/ 

#include "file2.h" 
#include "file2.c" /* <--- here it is! */ 

int main() 
{ 
    int y = increment(1); 
    return 0; 
} 

一切按預期工作。

但是,如果我只理解頭文件(只包含聲明)必須包括在內。那麼如何告知gcc 中聲明的函數increment的定義是在file2.c

+0

我覺得你最後一句話被切斷了。 – Mysticial

+0

對不起,我在上傳問題時遇到問題:) –

回答

7

最簡單的方法就是直接編譯他們兩個:

$ gcc -o program file1.c file2.c 

但你可能想要做的步驟更復雜的系統。這裏有一個簡單的命令行配方:

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

的東西複雜化這樣是使用make更妙的是,雖然。

除了您的具體問題,您爲什麼使用GCC?你可以使用clang並獲得更好的錯誤信息,更快的編譯,並且感覺就像你生活在未來!

+0

圖書館有什麼區別嗎?我不知道這個編譯器。 –

+0

@Matteo - clang幾乎可以替代gcc。 –

+0

謝謝!我會試一試:) 因此,如果我編寫Makefile,我可以在開始時像'COMPILER = clang'那樣定義一個變量,並使用'gcc'的相同選項保持文件的其餘部分不變? –

2

的gcc -o程序file2.c中file1.c中

這將彙編在file1.c和file2.c中,並將它們連接在一起。