Makefile的四種常用基本模板

模板1 生成單個可執行文件

####################################################
#將所在目錄下的所有C源文件,編譯成一個可執行文件
#實際使用時基本修改下配置參數部分即可
####################################################

#1 查找.c源文件,並定義同名.o文件
#makefile有隱晦規則,自動會將.c文件編譯成.o目標文件
SRCS := $(wildcard *.c)
OBJS := $(SRCS:%.c=%.o) 

####################################################
#2 配置參數
#TARGET 目標名 必須設置
#CC 編譯工具鏈名稱
#LIBS 庫文件 
#    用相對路徑或者絕對路徑均可,多個庫文件用空格
#    隔開,沒有留空
#LDFLAGS 鏈接庫文件標記,沒有留空
#INCLUDE 頭文件搜索目錄 
#    使用-I開頭,如-I./include,表示要到
#    ./include目錄下搜索頭文件,多個目錄,用空格
#    隔開,沒有留空
#DEFINES 自定義選項,如-D"DEBGU",定義宏"DEBUG"
#CFLAGS 編譯選項,發佈版本,可以去除-g,減小程序
####################################################
TARGET  := test
CC      := gcc
LIBS    :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I./include
CFLAGS  := -g -Wall -O3 -lpthread -lm $(DEFINES) $(INCLUDE)

#3 規則 規則部分最好不用修改
.PHONY : all clean rebuild

all: $(TARGET)  

$(TARGET) : $(OBJS)
    $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS)

rebuild: clean all

clean:
    rm -rf $(OBJS)
    rm -rf $(TARGET)

模板2 生成多個可執行文件

####################################################
#將所在目錄下的每個.c文件編譯成一個對應的可執行文件
#實際使用時基本修改下配置參數部分即可
####################################################

#1 查找.c源文件,並定義同名.o文件
#makefile有隱晦規則,自動會將.c文件編譯成.o目標文件
SRCS  := $(wildcard *.c)
OBJS  := $(SRCS:%.c=%.o)

####################################################
#2 配置參數
#TARGET 目標名 將每個.c文件去除後綴.c,得到目標名
#CC 編譯工具鏈名稱
#LIBS 庫文件 
#    用相對路徑或者絕對路徑均可,多個庫文件用空格
#    隔開,沒有留空
#LDFLAGS 鏈接庫文件標記,沒有留空
#INCLUDE 頭文件搜索目錄 
#    使用-I開頭,如-I./include,表示要到
#    ./include目錄下搜索頭文件,多個目錄,用空格
#    隔開,沒有留空
#DEFINES 自定義選項,如-D"DEBGU",定義宏"DEBUG"
#CFLAGS 編譯選項,發佈版本,可以去除-g,減小程序
####################################################
TARGET  := $(SRCS:%.c=%)
CC      := gcc
LIBS    :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I./include
CFLAGS  := -g -Wall -O3 -lpthread -lm $(DEFINES) $(INCLUDE)

#3 規則 規則部分最好不用修改
.PHONY : all clean rebuild

all: $(TARGET)

#方法一靜態模式
$(TARGET): %:%.o
    $(CC) $(CFLAGS)  -o $@ $^ $(LDFLAGS) $(LIBS)

#方法二,使用$< (依賴目標中的第一個目標名字。如果依賴目標
#是以模式(即"%")定義的,那麼"$<"將是符合模式的一系列的
#文件集。注意,其是一個一個取出來的。)
#利用$<這個特性來實現   
#$(TARGET): $(OBJ)
#   $(CC) $(CFLAGS)  -o $@ $< $(LDFLAGS) $(LIBS)

clean:
    rm -rf $(TARGET)
    rm -rf $(OBJS)

模板3 生成靜態庫

####################################################
#將所在目錄下的所有C源文件,編譯成一個.a靜態庫文件
#實際使用修改下配置參數即可
####################################################

#1 查找.c源文件,並定義同名.o文件
#makefile有隱晦規則,自動會將.c文件編譯成.o目標文件
SRCS := $(wildcard *.c)
OBJS := $(SRCS:%.c=%.o) 

####################################################
#2 配置參數
#  同模板一參數 此處不再詳述
####################################################
TARGET  := libtest.a
CC      := gcc
AR      := ar
RANLIB  := ranlib
DEFINES :=
INCLUDE := -I./include
CFLAGS  := -g -Wall -O3 $(DEFINES) $(INCLUDE)

#3 規則 規則部分最好不用修改
.PHONY : all clean rebuild

all: $(TARGET)  

$(TARGET) : $(OBJS)
    $(AR) r $@ $^
    $(RANLIB) $@

rebuild: clean all

clean:
    rm -rf $(OBJS)
    rm -rf $(TARGET)

模板4 生成動態庫

####################################################
#將所在目錄下的所有C源文件,編譯成一個.so動態庫文件
#實際使用修改下配置參數即可
####################################################

#1 查找.c源文件,並定義同名.o文件
#makefile有隱晦規則,自動會將.c文件編譯成.o目標文件
SRCS := #$(wildcard *.c)
OBJS := $(SRCS:%.c=%.o) 

####################################################
#2 配置參數
#  同模板一參數 此處不再詳述
####################################################
TARGET  := libtest.so
CC      := gcc
AR      := ar
RANLIB  := ranlib
LIBS    :=
LDFLAGS :=
DEFINES :=
INCLUDE := -I./include
CFLAGS  := -g -Wall -O3 $(DEFINES) $(INCLUDE)

#3 規則 規則部分最好不用修改
.PHONY : all clean rebuild

all: $(TARGET)  

$(TARGET) : $(OBJS)
    $(CC)  -fPIC -shared -o $@ $^ $(LDFLAGS) $(LIBS)

rebuild: clean all

clean:
    rm -rf $(OBJS)
    rm -rf $(TARGET)

調試makefile,使用命令”make -n“, 該命令,不會執行編譯過程,只會將make時的執行步驟按順序輸出到屏幕,方便查看完整的依賴規則情況。

發佈了37 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章