2009-09-14 107 views
5

所以我明白了標題與源文件的關係。我沒有得到的是編譯器知道如何編譯所有的源文件。例如:在C中包含源文件

example.h

#ifndef EXAMPLE_H 
#define EXAMPLE_H 

int example(int argument); // prototype 

#endif 

example.c

#include "example.h" 

int example(int argument) 
    { 
    return argument + 1; // implementation 
    } 

main.c

#include "example.h" 

main() 
    { 
    int whatever; 
    whatever = example(whatever); // usage in program 
    } 

如何進行編譯,編譯main.c,知道example()實施沒事的時候含udes example.c

這是某種IDE的東西,你添加文件到項目和東西?有沒有辦法做到「手動」,因爲我更喜歡一個純文本編輯器來離奇的IDE?

回答

5

是的,你必須告訴編譯器(通常是通過makefile,如果你沒有使用IDE)哪些源文件要編譯成目標文件,編譯器會分別編譯每一個。然後,您將鏈接器的對象文件列表合併到可執行文件中。如果鏈接器正在查找函數或類定義並且找不到它,則會出現鏈接錯誤。

+0

所以這就是makefile進來的地方,總是想知道它們適合在哪裏。謝謝。 – 2009-09-14 14:46:47

0

編譯器沒有。但是你的構建工具呢。 IDE或make工具。手工製作的方式是手工製作的Makefile

4

它不...你必須告訴它。
例如,磨片使用gcc,你首先會編譯文件:

gcc file1.c -c -ofile1.o 
gcc file2.c -c -ofile2.o 

然後編譯器編譯這些文件,假設您已經定義(比如你的例子功能)符號存在地方和意志在後來被鏈接。 那麼你的目標文件鏈接在一起:

gcc file1.o file2.o -oexecutable 

在這個時間點,鏈接器會查看這些assumtions和「澄清」他們即。檢查他們是否在場。這是它的基本工作原理...

至於你的IDE的問題,谷歌「生成文件」

+0

你的意思是'-c',而不是'-S',否則你不應該使用'.o'作爲輸出。 – 2009-09-14 14:46:53

+0

@hacker謝謝。固定...很難閱讀一長頁的選項... – aviraldg 2009-09-14 14:52:58

9

C或C++編譯實際上分成兩個獨立的階段。

  • 編譯

編譯器不知道的例子的實現()。它只知道有一些叫做example()的東西會在某個時候定義。所以它只是用佔位符生成代碼(例如)()

然後鏈接器就會出現並解析這些佔位符。

要使用gcc,你會怎麼做編譯代碼如下

gcc -c example.c -o example.o 
gcc -c main.c -o main.o 
gcc example.o main.o -o myProgram 

GCC的第一個2分調用被編譯步驟。第三個調用是鏈接器步驟。

+0

我認爲你的意思是gcc -c main.c -o main.o在第2步。 – baskin 2010-01-14 11:34:46

+0

@baskin,是的,我做到了。感謝捕捉。固定。 – Glen 2010-01-14 12:08:51

1

編譯器在編譯main.c時不知道example()的實現 - 編譯器只知道頭文件中包含的簽名(如何調用它)。編譯器生成.o對象文件,稍後通過鏈接器鏈接該對象文件以創建可執行二進制文件。構建過程可以由IDE控制,或者如果您喜歡Makefile。 Makefiles有一個獨特的語法,需要學習一些理解,但會使構建過程更清晰。如果您搜索Makefile,網上有很多很好的參考資料。