本周主要學習在Linux系統下使用Makefile對多個C語言源程序進行編譯。
對于多個C語言源程序編譯的時候,可以進行合并編譯,例如下:
$ gcc main.c stack.c maze.c -o main
但是這種辦法并不是很好,由于一般大型軟件大多由上千個源程序組成,所以當其中的一個出錯,還需把所有源文件重新編譯一遍,而全部編譯一遍需要幾個小時,所以這種方法并不是首選,除非源程序數量極少。
還有一種方法如下:
$ gcc -c main.c
$ gcc -c stack.c
$ gcc -c maze.c
$ gcc main.o stack.o maze.o -o main
如果編譯之后又對maze.c做了修改,要重新編譯只需要做兩步:
$ gcc -c maze.c
$ gcc main.o stack.o maze.o -o main
然而這樣也與上一種方法有著類似的弊端,比如說尋找錯誤困難,重新編譯耗時長。
所以使用Makefile對C語言進行編譯不失為一種首選方法。
make 程序利用Makefile的數據和每個文件最新一次更改的時間來確定哪些文件需要更新;對每個需要更新的文件,make程序使用Makefile中定義的命令來更新它。
Makefile一般格式:
target(要生成的文件): dependencies(被依賴的文件)
#命令前面用的是“tab”而非空格。誤用空格是初學者容易犯的錯誤!
命令1
命令2
命令3
.
.
.
命令n
目標和條件之間的關系是:欲更新目標,必須首先更新它的所有條件;所有條件中只要有一個條件被更新了,目標也必須隨之被更新。所謂“更新”就是執行一遍規則中的命令列表,命令列表中的每條命令必須以一個Tab開頭,注意不能是空格,Makefile的格式不像C語言的縮進那么隨意,對于Makefile中的每個以Tab開頭的命令,make會創建一個Shell進程去執行它。
所以將源程序和頭文件放在同一目錄下,在該目錄下運行make命令即可進行編譯。