SRCS = $(wildcard *.c ../lib/*.c) #wildcard把 指定目录 ./ 和 ../lib 下的所有后缀是c的文件全部展开。
OBJS = $(SRCS:.c = .o) #OBJS将$(SRCS)下的.c文件转化为.o文件
CC = gcc #代表所使用的编译器
INCLUDES = -I../include \ #头文件查找路径
-I. \
#链接库查找地址
LIBSDIR = -L../lib \
-L../3rdParty/lib
LIBS = -lpthread \ #链接库
-lslog
CCFLAGS = -g -Wall -O0 #附加参数
OUTPUT = login_server #输出程序名称
all:$(OUTPUT)
$(OUTPUT) : $(OBJS)
$(CC) $^ -o $@ $(CCFLAGS) $(INCLUDES) $(LIBSDIR) $(LIBS)
%.o : %.c
$(CC) -c $< $(CCFLAGS)
clean:
rm -rf *.out *.o #清除中间文件及生成文件
Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
注意每一行命令 都是以tab键开始
实际例子
#wildcard把 指定目录 ./ 和 ../base 下的所有后缀是cpp cc的文件全部展开。
SRCS = $(wildcard *.cpp ../base/*.cpp ../base/pb/protocol/*.cc)
OBJS = $(SRCS:.c = .o) #OBJS将$(SRCS)下的.cc文件转化为.o文件
CC = gcc #代表所使用的编译器
CXX =g++
##头文件查找路
INCLUDES = -I../base \
-I. \
-I../../3rdParty/log4cxx/include \
-I../../3rdParty/protobuf/include \
-I../../3rdParty/slog \
-I../../3rdPary/slog/include \
-I../../3rdParty/json/include \
-I../base/pb/protocol
#链接库查找地址
LIBSDIR = -L../../3rdParty/log4cxx/lib \
-L../../3rdParty/protobuf/lib \
-L../../3rdParty/slog \
-L../../3rdParty/json/lib
LIBS =-llog4cxx \
-lprotobuf \
-lprotobuf-lite \
-lprotoc \
-lslog \
-lpthread \
-ljsoncpp \
-lcurl \
-lssl \
-lcrypto
CCFLAGS = -g -Wall -O0 #附加参数
OUTPUT = login_server #输出程序名称
all:$(OUTPUT)
$(OUTPUT) : $(OBJS)
$(CXX) $^ -o $@ $(CCFLAGS) $(INCLUDES) $(LIBSDIR) $(LIBS)
%.o : %.c
$(CXX) -c $< $(CCFLAGS)
clean:
rm -rf *.out *.o #清除中间文件及生成文件
.PHONY:clean
网友分享的模板,可以编译程序、动态库、静态库
SHELL = /bin/sh
CC = gcc
AR = ar
RANLIB = ranlib
SRCDIR = ./
ARFLAGS = crs
CFLAGS += -D _DEBUG
CFLAGS += -g
#INCLUDES += ./
OUTDIR := out
BIN := $(OUTDIR)/hello
STATICLIB = $(OUTDIR)/libhello.a
SHAREDLIB = $(OUTDIR)/libhello.so
SRCS = $(wildcard *.c)
SUBDIRS += ./tmp
#OBJS = $(SRCS:.c=.o)
SRCS += $(foreach subdir,$(SUBDIRS),$(wildcard $(subdir)/*.c))
OBJS = $(patsubst %.c,%.o,$(foreach subfile,$(SRCS),$(notdir $(subfile))))
objs = $(SRCS:.c=.o)
OUT_OBJS = $(addprefix $(OUTDIR)/,$(OBJS))
VPATH = ./tmp
.PHONY: all clean help staticlib
all: objdir $(BIN)
# build static lib
staticlib: objdir $(objs) $(STATICLIB)
$(STATICLIB):$(OBJS)
$(AR) $(ARFLAGS) $@ $(addprefix $(OUTDIR)/,$^)
#build shared lib
sharedlib: objdir $(OUTDIR)/$(objs) $(SHAREDLIB)
$(SHAREDLIB):$(OBJS)
gcc -shared -o $@ $(addprefix $(OUTDIR)/,$^)
$(BIN):$(OBJS)
gcc -o $@ $(addprefix $(OUTDIR)/,$^)
%.o:%.c
gcc $(CFLAGS) $(INCLUDES) -c $< -o $@
@mv $@ $(OUTDIR)/
objdir:
mkdir -p $(OUTDIR)
@echo $(OUT_OBJS)
help:
@echo ""
@echo "make all"
@echo "make clean"
@echo "make staticlib"
@echo "make sharedlib"
@echo ""
clean:
-rm -rf *.o *.a *.so $(BIN) $(OUTDIR)
makefile 学习地址
跟我一起写makefile