一个通用的C/C++ Makefile
来源:互联网 发布:三甲医院体检中心知乎 编辑:程序博客网 时间:2024/05/23 15:47
转自 http://c4fun.cn/blog/2014/01/30/common-makefile/
赶在蛇年的最后一天,写了一个通用的GNU/Linux环境下的Makefile。
该Makefile适用于最后生成若干个可执行文件的小型C/C++工程,只要将该Makefile放在源码根目录下make,它会自动查找该目录下(包括子目录)的所有源码文件(支持.cpp .c .h格式)并自动生成正确的依赖关系,并且为了不污染源码文件夹,源码和编译过程中的中间文件会分开(Debug模式编译生成的中间文件在Debug目录下,Release模式在Release目录下)。
试了几个之前写过的Project,都是OK的。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
############################################################# MAKEFILE FOR C/C++ PROJECT# Author: swm8023 <swm8023@gmail.com># Date: 2014/01/30############################################################.PHONY: all cleanall: # annotation when release versionDEBUG := yTARGET_PROG := main# project directoryDEBUG_DIR := ./DebugRELEASE_DIR := ./ReleaseBIN_DIR := $(if $(DEBUG), $(DEBUG_DIR), $(RELEASE_DIR))# shell commandCC := gccCXX := g++RM := rm -rfMKDIR := mkdir -pSED := sedMV := mv# init sources & objects & dependssources_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 variableCFLAGS := $(if $(DEBUG),-g -O, -O2)CFLAGS += $(addprefix -I ,$(sort $(dir $(sources_h))))CXXFLAGS = $(CFLAGS)LDFLAGS := LOADLIBES += #-L/usr/include/mysqlLDLIBS += #-lpthread -lmysqlclient# add vpathvpath %.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)
0 0
- 一个C/C++通用的Makefile模板
- 一个通用的C/C++ Makefile
- 一个通用的C/C++ Makefile
- 一个通用的C/C++编译Makefile
- 一个C/C++通用Makefile
- 用于编译C/C++的一个通用Makefile文件
- 一个用于对 C/C++ 的通用 Makefile
- C/C++ 通用 Makefile
- C/C++ 通用 Makefile
- C/C++ 通用 Makefile
- C/C++ 通用 Makefile
- C/C++ 通用 Makefile
- C/C++ 通用 Makefile
- C/C++ 通用 Makefile
- C/C++ 通用 Makefile
- C/C++ 通用 Makefile
- C/C++ 通用 Makefile
- C/C++ 通用 Makefile
- 关于Objective-c和Java下DES加密保持一致的方式
- leetcode题目--Reverse Words in a String解答
- savedInstanceState的作用
- 《30天自制操作系统》笔记四
- cpc央行继续正回购收缩流动性
- 一个通用的C/C++ Makefile
- UINavigationItem如何设置backBarButtonItem
- Loadrunner中web_find和web_reg_find函数的使用与区别
- Hadoop-2.2.0中文文档—— Shell命令
- 【梦幻连连连】源码分析(四)-触摸处理
- 中缀后缀表达式的转换
- 流媒体
- ashx文件中使用session提示“未将对象引用设置到对象的实例”的解决方法
- Genymotion配置及使用教程(最新最完整版附各部分下载地址)