在公司學到的Makefile。
以前版:
CC = gcc
CFLAGS = -I.
DEPS = calc.h
all:server #在這裡 加入 clean 就可以自動清除 == make clean
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
server: server.o
$(CC) -o $@ $^ $(CFLAGS) #如果在前面加上 ‘@’就不會顯示編譯資訊
# $@ 意思是位址,即本目錄;也可以指定目錄
# $^ 意思是所依賴的檔案
# calc: main.o getch.o getop.o stack.o
# $(CC) -o calc main.o getch.o getop.o stack.o $(CFLAGS)
.PHONEY: clean
clean:
@rm -f *.o core-* *~ *.*~
現在版:
.SUFFIXES: .o .c #連接配接字尾,把.o .c 這些檔案連接配接起來編譯
CC = gcc
HOMEDIR = $(HOME)/test/MakeFile/wildcard
CFLAGS = -I$(HOMEDIR)/include/
SRCDIR = ./src
SRCDIR2= ./src/src
OBJDIR = ./object
BINDIR = ./bin
VPATH = $(SRCDIR):$(SRCDIR2)
SRC = $(wildcard $(SRCDIR)/*.c) $(wildcard $(SRCDIR2)/*.c) # 顯示所有 .c 檔案
OBJ = $(patsubst %.c, $(OBJDIR)/%.o, $(notdir $(SRC))) # 把顯示 .c 檔案字尾,替換成 .o,指定目錄
PARAM = hello
all: $(PARAM)
$(PARAM): $(OBJ)
$(CC) -o $(BINDIR)/$(PARAM) $^ $(CFLAGS) # 直接把要生成的檔案放到 指定目錄下
echo $(SRC)
echo $(OBJ)
$(OBJDIR)/%.o:%.c
$(CC) -c -o $@ $< $(CFLAGS)
.PHONY: clean
clean:
$(RM) $(OBJDIR)/*.o $(BINDIR)/$(PARAM)
主要知道wildcard ,notdir,patsubst這三個函數是幹嘛的就會了。
1、wildcard : 擴充通配符
2、notdir : 去除路徑
3、patsubst :替換通配符
4.wildcard 這個就是找某個目錄下的檔案的 裡面是比對的模式
5.$(notdir $(SRC)) 就是把路徑去了,隻剩下檔案名
6.$(patsubst %.cpp,$(OBJDIR)/%.o,$(notdir $(SRC))) 這個就是把把.CPP都替換成.O