make是一種控制編譯或者重複編譯軟件的工具。 make能夠自動關鍵軟件的編譯內容、方式和時機,從而使程序員把更多的精力集中在編寫代碼上。 make主要的機制是在命令行鍵入make命令,make會自動執行當前目錄下的makefile文件 makefile規則 標號:依賴項 (tab鍵)命令代碼 (tab鍵)命令代碼 --每一個命令代碼的第一個字符必須是tab鍵,而不是空格鍵,否則make會報錯。 命令行直接鍵入make,make默認只會執行第一個標號的命令代碼
上圖命令行詳解 start:hello.o--表示執行start標號下的命令行須要hello.o文件, 若是當前目錄下有hello.o文件,那麼會直接執行start標號下的命令行; 若是當前目錄下沒有hello.o文件,那麼make會自動尋找生成hello.o文件的標號,找到hello.o標號, 執行hello.o標號下的命令行,而後執行start標號下的命令行。
若是須要執行指定標號的命令行,必須使用make參數 --make 須要執行的標號 --例如:make clean
在make語法中"@"表示不打印該命令語句,只打印命令執行結果 --例如@echo "-OK--" 只會打印-OK---
爲了簡化編輯和維護makefile,能夠在makefile中使用變量。 --varname=some_text 把變量用括號擴起來,前面加上$符號就能夠引用該變量的值 --$(varname) 按照慣例makefile的變量都是大寫
$(SRCS:.c=.o)意思是將SRCS變量中的.c替換成.o
在makefile中用"#"來添加註釋
make中的依賴聲明 .SUFFIXES:.c (一個空格) .o --這代表.o文件依賴於.c文件,.c和.o文件之間存在着依賴關係 --強調:使用.SUFFIXES來表示兩個文件的依賴關係,必須兩個文件的文件名一致,只是文件類型不一樣才能夠適應.SUFFIXES 在make語句start:$(OBJS)中,代表依賴項是.o文件,根據.SUFFIXES聲明,.o文件依賴於.c文件,找到".c.o"標籤,執行該標籤下的命令 --$@表示生成的目標文件 --$<表示生成目標的源文件
--$^表示依賴項 --$@、$<都是針對於.SUFFIXES聲明而言的,在.SUFFIXES聲明定義的目標文件才用$@表示,源文件才用$<表示。
make中多個.c文件聯合編譯 --SRCS=hello.c\ (tab鍵)add.c --這表示有兩個源文件, --OBJS=$(SRCS:.c=.o) 此時也會對應的生成兩個.o文件 --start:$(OBJS)這時候會發現兩個依賴項,因此會執行".c.o"標籤兩次,從而生成兩個.o文件。
make編譯多文件時,會以.c文件的時間和.o文件的時間作對比,只編譯修改過的.c文件,提升編譯效率。
.PHONY:clean WORKDIR=. VPATH = ./src LIBOBJS= socketclient.o itcastlog.o OBJS= demo01_testplatform.o LIB1 = libmysocket.so EXE1 = mysocketexe CC = gcc CFLGS= -Wall -g -I$(WORKDIR)/inc/ LIBFLAG = -L$(HOME)/lib all: $(LIB1) $(EXE1) $(LIB1):$(LIBOBJS) $(CC) -shared -fPIC $^ -o $@ cp $(LIB1) $(HOME)/lib mv $(LIB1) ./lib $(EXE1):$(OBJS) $(CC) $^ $(LIBFLAG) -lmysocket -o $@ .c.o: $(CC) $(CFLGS) -c $< -o $@ -shared -fPIC clean: rm -rf $(BIN) *.o $(HOME)/lib/$(LIB1) ./$(LIB1)