1-2个代码文件的简单的程序用不用Makefile都没问题,复杂的项目最好用Makefile,下面改造下上面的MakeFile,尽量使用Makefile比较高阶的语法。
1、原始Makefile
test.o:test.c gcc test.c -o test.o -lpthread
2、改成使用变量
SRC := test.c OBJ := test.o TAR := tt CC := gcc $(TAR):$(OBJ) $(CC) $(OBJ) -o $(TAR) -lpthread
这个时候test.o并不存在,但是也能编译成功,看编译过程
会自动执行一句gcc -c -0 test.o test.c
和下面这种写法效果是一样的
SRC := test.c OBJ := test.o TAR := tt CC := gcc $(TAR):$(OBJ) $(CC) $(OBJ) -o $(TAR) -lpthread %.o:%.c $(CC) -o $@ -c $< -lpthread
$@:目标的名字
$^:构造所需文件列表所有文件的名字
$<:构造所需文件的第一个文件的名字
$?:构造所需文件列表中更新过的文件
3、一个较典型的Makefile文件写法
CC = gcc INCLUDE = -I ./include LIBS += -lpthread -lzlog LIB_PATH += -L ./lib CFLAGS = -Wall -Wno-unused-function -Wno-unused-variable OBJS = test.o config.o #OBJS = *.o TARGET = tt all:$(TARGET) $(TARGET):$(OBJS) $(CC) -o $@ $^ $(LIBS) $(LIB_PATH) %.o:%.c $(CC) $(CFLAGS) -c $< -o $@ $(INCLUDE) .PHONY: all clean cleanobject cleanobject: rm -rf *.o clean: rm -rf *.exe *.o tt