首先,編寫makefile檔案,要明白一些概念。
很多的windows程式設計師都不知道這個東西,因為windows的ide編譯環境都打好包做了這個工作了。而在linux下編譯自己的程式,學會寫makefile是做為linux程式的基礎。
無論是哪種編譯環境下(c\c++\pas),首先都是先把原始檔編譯成中間**檔案,在windows下是*.obj檔案,unix/linux下是*.o,產生這樣的*.obj,*.o的過程叫「編譯compile」,然後把大量的.obj,.o檔案合成乙個可執行的檔案叫「連線link」。
簡單說,make就是makefile中執行規則的「開關按鈕」,在命令列輸入make,該檔案或目錄就會按照makefile裡編寫好的規則進行編譯和鏈結程式。
如果這個工程沒有編譯過,那麼我們的所有c檔案都要被編譯和鏈結。
如果這個工程的某幾個c檔案修改,那麼我們只編譯被修改的c檔案,並鏈結目標程式。
如果這個工程的標頭檔案被改變了,那麼我們需要編譯引用了這幾個標頭檔案的c檔案,並鏈結目標程式。
只有我們的makefile寫的夠好,所有的這一切,我們只用乙個make命令就可以完成,make命令會自動智慧型地根據當前的檔案修改的情況來確定哪些檔案需要重新編譯,從而自己編譯所需要的檔案盒連線目標程式。
target...:prerequisites...
(tab開頭)command
target也就是乙個目標檔案,可以是.o,也可以是執行檔案,還可以是乙個標籤(label)。
prerequisites就是要生成那個target所需要的檔案或目標。
command也就是make 需要執行的命令。任意的shell命令
這是乙個檔案的依賴關係,也就是說,target這乙個或多個的目標檔案依賴於prerequisites中的檔案,其生成規則定義在command中。說白一點就是prerequisites
中如果有乙個以上的檔案比target檔案要新的話,command所定義的命令就會被執行。這就是makefile的規則。也就是makefile中最核心的內容。
正如前面所說的,如果乙個工程有3個頭檔案,和8個c檔案,我們為了完成前面所述的那三個規則,我們的makefile應該是下面的這個樣子的
edit:main.o kbd.o command.o display.o\
sert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
makefile檔案編寫
hello.c include include function.h int main function.c includeint fun1 int fun2 int fun3 function.h ifndef fun h define fun h int fun1 void int fun2 v...
Makefile檔案編寫
1 基本大全教程 2 四個賦值的區別 是最基本的賦值 是覆蓋之前的值 是如果沒有被賦值過就賦予等號後面的值 是新增等號後面的值其中 和 的區別是 立馬賦值,是整個makefile檔案讀取完後賦值。1 make會將整個makefile展開後,再決定變數的值。也就是說,變數的值將會是整個makefile...
Makefile檔案編寫
main3.c 1 include 2 include static lib.h 3 include fun.h 4 5int main void static lib.h和 1 extern int add int a,int b 2 extern int sub int a,int b 3 ex...