makefile模板

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

https://seisman.github.io/how-to-write-makefile/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

致一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值