Linux make語法

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) 
    
相關文章
相關標籤/搜索