模板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時的執行步驟按順序輸出到屏幕,方便查看完整的依賴規則情況。