Linux C++ makefile編寫 通用型
阿新 • • 發佈:2021-01-03
建立如下目錄 bin、include、obj、src
#把所有的目錄做成變數,方便修改和移植
BIN = ./bin
SRC = ./src
INC = ./include
OBJ = ./obj
#提前所有原始檔(即:*.c檔案)和所有中間檔案(即:*.o)
SOURCE = $(wildcard ${SRC}/*.c)
OBJECT = $(patsubst %.c,${OBJ}/%.o,$(notdir ${SOURCE}))
#設定最後目標檔案
TARGET = main
BIN_TARGET = ${BIN}/${TARGET}
CC = gcc
XX=g++
CFLAGS = -g -Wall -I${INC}
#用所有中間檔案生成目的檔案,規則中可以用 $^替換掉 ${OBJECT}
${ BIN_TARGET }:${OBJECT}
$(XX) -o [email protected] ${OBJECT}
#生成各個中間檔案
${OBJ}/%.o:${SRC}/%.c
$(CC) $(CFLAGS) -o [email protected] -c $<
${OBJ}/%.o:${SRC}/%.cpp
$(XX) $(CFLAGS) -o [email protected] -c $<
.PHONY:clean
clean:
find $(OBJ) -name *.o -exec rm -rf {} \; #這個是find命令,不懂的可以查下資料
rm -rf $(BIN_TARGET)
函式說明
wildcard 這是擴充套件萬用字元函式,功能是展開成一列所有符合由其引數描述的文 件名,檔案間以空格間隔;比如:羅列出src下的所有.c檔案:$(wildcard ${SRC}/*.c)
SOURCES = S(wildcard *.c *.cpp) 產生一個以.c .cpp 結尾的檔案的列表,然後存入變數SOURCES裡
patsubst 這是匹配替換函式, patsubst ( 需要匹配的檔案樣式,匹配替換成什麼檔案,需要匹配的原始檔)函式
比如:用src下的*.c替換成對應的 *.o檔案存放到obj中:
$(patsubst %.c, ${OBJ}/%.o, $(notdir $(SOURCE)))
$(patsubst %.cpp,%.o,$(SOURCES)) 將$(SOURCES)中的.cpp 替換成 .o
notdir 這是去除路徑函式,在上面patsubst函式中已經使用過,去除SOURCE中檔案的所有目錄,只留下檔名;
變數:
[email protected]:表示目標檔案;一般是在規則中這麼用:gcc -o [email protected] $(object);
$^:表示所有依賴檔案;一般是在規則中這麼用:gcc -o [email protected] $^ ;用所有依賴檔案連結成目的檔案;
$<:表示第一個依賴檔案;在規則中使用:gcc -o [email protected] -c $< ;其實這個時候就是每個依賴檔案生成一個目的檔案;
-Wall 輸出所有警告資訊
-O 編譯時進行優化
-g 表示編譯debug版本
Makefile基本語法
target為要生成的目標檔案;dependency為target的依賴檔案;command為用於生成target的命令列;
<target> : <dependency> <dependency> ...
(tab)<command>
(tab)<command>
PHONY
用.PHONY修飾的target是“偽目標”,不需要生成真實的檔案;make假定phony target是已經生成的,然後更新它後邊的依賴檔案和執行它下邊的命令(command)。