1. 程式人生 > 其它 >Linux C++ makefile編寫 通用型

Linux C++ makefile編寫 通用型

技術標籤:linuxmakefile

建立如下目錄 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)。