二、makefile(上)01.make工具 利用make工具可以自動完成編譯工作。這些工作包括:如果修改了某幾個源文件,則只重裝新編譯這幾個源文件;如果某個頭文件被修改了,則重新編譯所有包含該頭文件的源文件。利用這個自動編譯可大大簡化開發工作,避免不必要的重新編譯。 make工具通過一個稱為M
二、makefile(上)01.make工具 利用make工具可以自動完成編譯工作。這些工作包括:如果修改了某幾個源文件,則只重裝新編譯這幾個源文件;如果某個頭文件被修改了,則重新編譯所有包含該頭文件的源文件。利用這個自動編譯可大大簡化開發工作,避免不必要的重新編譯。 make工具通過一個稱為Makefile的文件來完成並自動維護編譯工作。Makefile文件描述了整個工程的編譯、鏈接等規則。02.Makefile的基本規則: TARGET...:DEPENDENCIES... COMMAND ... 目標(TARGET)程式產生的文件,如何執行文件和目標文件;目標也可以是要執行的動作,如clean,也成為偽目標。 依賴(DEPENDENCIES)是用來產生目標的輸入文件列表,一個目標通常依賴於多個文件。 命令(command)是make執行的動作(命令是shell命令或是可在shell下執行的程式)。註意:每個命令行的起始字元必須為TAB字元! 如果DEPENDENCIES中有一個或多個文件更新的話,COMMAND就要執行,這就是Makefile最核心的內容#touch main.c add.c sub.c add.h sub.h#lsmain.c add.c sub.c add.h sub.h#vi main.cint main(){ return 0;}#vi Makefilemain:main.o add.o sub.o gcc -Wall -g main.o add.o sub.o -o mainmain.o:main.c gcc -Wall -g -c main.c -o main.oadd.o:add.c add.h gcc -Wall -g -c add.c -o add.osub.o:sub.c sub.h gcc -Wall -g -c sub.c -o sub.o#make(預設生成第一個目標)#lsmain#make(文件沒有變化)make:'main' id up to date#touch sub.h(重新生成sub.h)#makegcc -Wall -g -c sub.c -o sub.ogcc -Wall -g main.o add.o sub.o -o mainclean:(偽目標,並不是要生成的文件,用來刪除這些文件) rm -f main main.o add.o sub.o#make clean將鏈接文件全部刪除#make main.o只生成main.o這個文件.PHONY:clean(Makefile文件的最開頭.表示clean是一個偽目標)如果Makefile所在的文件夾下,存在clean文件,則執行make clean時會提示:make:'clean'is up to date.03.Makefile自動化變數$@:規則的目標文件名$<:規則的第一個依賴文件名$^:規則的所有依賴文件列表#vi Makefile.1.PHONY:cleanOBJECTS=main.o add.o sub.omain:$(OBJECTS) gcc -Wall -g $^ -o [email protected]:main.c gcc -Wall -g -c $< -o [email protected]:add.c add.h gcc -Wall -g -c $< -o [email protected]:sub.c sub.h gcc -Wall -g -c $< -o $@clean: @(加@不會列印在屏幕上)echo "begin delete..."(命令還是要執行) rm -f main $(OBJECTS)#make(正常工作)#make clean(正常工作)#make clean -f Makefile.1(以Makefile.1的規則來執行clean這個命令)begin delete...rm -f main main.o add.o sub.o04.Makefile編譯多個可執行文件 模式規則:%.o:%.c 尾碼規則:.c.o#mkdir 01#mv *.c 01#ls#mv *.* 01#ls01 Makefile#mv Makefile 01#ls#mkdir 02#cd 02#touch 01test.c 02test.c(01test.c,02test.c都要生成可執行文件)#vi 01test.c int main(void){ return 0;}#vi02test.cint main(void){ return 0;}#vi Makefile.PHONY:cleanBIN=01test 02testall:$(bin)01test:01test.o gcc -Wall -g $^ -o $@02test:02test.o gcc -Wall -g $^ -o $@clean: rm -f *.o $(BIN)#make01test 02test#vi MakefileBIN依賴兩個文件all這個目標依賴BIN兩個文件編譯器自動將同名的"*.c"文件生成同名可執行文件#makecc 01test.c -o 01testcc 02test.c -o 02test#make clean#ls01test.c 02test.c Makefile#makecc -c -o 01test.o 01test.cgcc -Wall -g -c 01test.o -o 01test#make clean#ls01test.c 02test.c Makefile#vi Makefile%.o:%.c(將對應的.c文件生成.o文件) gcc -Wall -g -c $< -o $@#make clean#make#ls#vi MakefileCC=gccCFLAGS=-Wall -g#%.o:%.c# $(CC) $(CFLAGS) -c $< -o [email protected]: $(CC) $(CFLAGS) -c $< -o $@01test:01test.o $(CC) $(CFLAGS) $^ -o $@02test:02test.o(將游標定位到這裡,輸入2yy,複製兩行) $(CC) $(CFLAGS) $^ -o $@(點擊p,複製到這裡)#make clean#make#ls#vi 03test.cint mian(void){ return 0;}