Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 一个通用的C/C++ Makefile

写了一个通用的GNU/Linux环境下的Makefile。该Makefile适用于最后生成若干个可执行文件的小型C/C++工程,只要将该Makefile放在源码根目录下make,它会自动查找该目录下(包括子目录)的所有源码文件(支持.cpp .c .h格式)并自动生成正确的依赖关系,并且为了不污染源码文件夹,源码和编译过程中的中间文件会分开(Debug模式编译生成的中间文件在Debug目录下,Release模式在Release目录下)。试了几个之前写过的Project,都是OK的。###########################################################
#
# MAKEFILE FOR C/C++ PROJECT
# Author: swm8023 <swm8023@gmail.com>
# Date: 2014/01/30
#
###########################################################.PHONY: all clean
all:# annotation when release version
DEBUG     := y
TARGET_PROG := main# project directory 
DEBUG_DIR := ./Debug
RELEASE_DIR := ./Release
BIN_DIR   := $(if $(DEBUG), $(DEBUG_DIR), $(RELEASE_DIR))# shell command
CC    := gcc
CXX := g++
RM    := rm -rf
MKDIR := mkdir -p
SED := sed
MV    := mv# init sources & objects & depends
sources_all := $(shell find . -name "*.c" -o -name "*.cpp" -o -name "*.h")
sources_c := $(filter %.c, $(sources_all))
sources_cpp := $(filter %.cpp, $(sources_all))
sources_h := $(filter %.h, $(sources_all))
objs        := $(addprefix $(BIN_DIR)/,$(strip $(sources_cpp:.cpp=.o) $(sources_c:.c=.o)))
deps        := $(addprefix $(BIN_DIR)/,$(strip $(sources_cpp:.cpp=.d) $(sources_c:.c=.d)))# create directory
$(foreach dirname,$(sort $(dir $(sources_c) $(sources_cpp))),
  $(shell $(MKDIR) $(BIN_DIR)/$(dirname)))# complie & link variable
CFLAGS   := $(if $(DEBUG),-g -O, -O2)
CFLAGS   += $(addprefix -I ,$(sort $(dir $(sources_h))))
CXXFLAGS    = $(CFLAGS)
LDFLAGS    :=
LOADLIBES  += #-L/usr/include/mysql
LDLIBS   += #-lpthread -lmysqlclient# add vpath
vpath %.h $(sort $(dir $(sources_h)))
vpath %.c $(sort $(dir $(sources_c)))
vpath %.cpp $(sort $(dir $(sources_cpp)))# generate depend files
# actually generate after object generated, beacasue it only used when next make)
ifneq "$(MAKECMDGOALS)" "clean"
sinclude $(deps)
endif# make-depend(depend-file,source-file,object-file,cc)
define make-depend
  $(RM) $1;                                   
  $4 $(CFLAGS) -MM $2 |                       
  $(SED) "s,($(notdir $3)): ,$3: ," > $1.tmp;
  $(SED) -e "s/#.*//"                         
       -e "s/^[^:]*: *//"                   
       -e "s/ *\$$//"                       
       -e "/^$$/ d"                         
       -e "s/$$/ :/" < $1.tmp >> $1.tmp;     
  $(MV) $1.tmp $1;
endef# rules to generate objects file
$(BIN_DIR)/%.o: %.c
 @$(call make-depend,$(patsubst %.o,%.d,$@),$<,$@,$(CC))
 $(CC) $(CFLAGS) -o $@ -c $<$(BIN_DIR)/%.o: %.cpp
 @$(call make-depend,$(patsubst %.o,%.d,$@),$<,$@,$(CXX))
 $(CXX) $(CXXFLAGS) -o $@ -c $<# add-target(target,objs,cc)
define add-target
  REAL_TARGET += $(BIN_DIR)/$1
  $(BIN_DIR)/$1: $2
 $3 $(LDFLAGS) $$^ $(LOADLIBES) $(LDLIBS) -o $$@
endef# call add-target
$(foreach targ,$(TARGET_PROG),$(eval $(call add-target,$(targ),$(objs),$(CXX))))all: $(REAL_TARGET) $(TARGET_LIBS)clean:
 $(RM) $(BIN_DIR)用于编译C/C++的一个通用Makefile文件  http://www.linuxidc.com/Linux/2011-09/43992.htm本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-02/112713.htm