Makefile锦集(持续更新中)

1、为每个源文件生成一个可执行程序

使用场景:目录下的所有源文件都能生成可执行程序。如在做《C++ Primer》练习时,每个练习都是一个独立的小程序,不必为每个练习编写一个Makefile,也不必为每个练习执行g++编译。

CC :=gcc 
CFLAGS := -g -Wall 
SOURCES := $(wildcard *.c)
TARGETS := $(patsubst %.c,%,$(SOURCES))

#define a function
define MAKE_EACH_SRC_BIN
$1:$1.c
	$(CC) $(CFLAGS) $< -o $@
endef

all:$(TARGETS)
	$(foreach target,$(TARGETS),$(call MAKE_EACH_SRC_BIN $(target)))

clean:
	rm -rf $(TARGETS)

2、通用性较强的Makefile

使用场景:可以应对大多数类型的工程,包含多个目录的工程,不必为每个目录编写一个Makefile。自动生成头文件依赖,不必因改变头文件而make clean。

GROOT     :=$(shell pwd)
PROGRAM   := iked
SRCDIRS   := . ./isakmp ./ikev1 ./crypto
SRCEXTS   := .c .cc
CPPFLAGS  := -Wall -Werror -g -m32
CFLAGS    :=  
CFLAGS    += 
CXXFLAGS  := -I/usr/local/openssl/include
CXXFLAGS  += -I$(GROOT)/ -I$(GROOT)/isakmp -I$(GROOT)/crypto -I$(GROOT)/ikev1
LDFLAGS   := -lpthread -L/usr/local/openssl/lib -lcrypto -ldl
LDFLAGS   += -m32 

#CC      = gcc 
#CXX     = g++ 
#CC      = $(CXX)  
#CFLAGS  = $(CXXFLAGS) 
#RM        = rm -f

SHELL   = /bin/sh  
SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))  
OBJS    = $(foreach x,$(SRCEXTS), $(patsubst %$(x),%.o,$(filter %$(x),$(SOURCES))))
DEPS    = $(patsubst %.o,%.d,$(OBJS))  
.PHONY : all objs clean cleanall rebuild  
all : $(PROGRAM) 

%.d : %.c  
	@$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@
%.d : %.C  
	@$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@
%.d : %.cc  
	@$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@
%.d : %.cpp  
	@$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@
%.d : %.CPP  
	@$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@
%.d : %.c++  
	@$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@
%.d : %.cp  
	@$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@
%.d : %.cxx  
	@$(CC) -MM -MT ${@:%.d=%.o} -MD $(CXXFLAGS) $< -o $@

objs : $(OBJS)  
%.o : %.c  
	$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ 
%.o : %.C  
	$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ 
%.o : %.cc  
	$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ 
%.o : %.cpp  
	$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ 
%.o : %.CPP  
	$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ 
%.o : %.c++  
	$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ 
%.o : %.cp  
	$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ 
%.o : %.cxx  
	$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ 

$(PROGRAM) : $(OBJS)  
ifeq ($(strip $(SRCEXTS)), .c)  # C file  
	$(CC) -o $(PROGRAM) $(OBJS) $(LDFLAGS)  
else                            # C++ file  
	$(CXX) -o $(PROGRAM) $(OBJS) $(LDFLAGS)  
endif  
-include $(DEPS)  
rebuild: clean all  
clean :  
	@$(RM) $(OBJS) $(DEPS)  
cleanall: clean  
	@$(RM) $(PROGRAM) $(PROGRAM).exe  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值