通过shell指令和Makfile命令,创建通用的C/C++ makefile。需在当前文件夹创建bin,obj,lib三个子文件夹。
makefile文件会自动搜索当前文件夹及其子文件夹中的C/C++文件。其中bin文件夹保存生成的可执行文件myapp,obj文件夹保存生成的中间文件*.o,lib保存需要的库文件。
############################### # Should create dir bin,obj,lib # Created by # 2016/06/14 ############################### DIR_INC=. DIR_SRC=. DIR_BIN=./bin DIR_OBJ=./obj DIR_LIB=./lib sources_all := $(shell find . -name "*.c" -o -name "*.cpp" -o -name "*.h") sources_c := $(filter %.c, $(sources_all)) sources_h := $(filter %.h, $(sources_all)) INC_HEADER := $(sort $(dir $(sources_h))) DIR_INC := $(strip $(subst / ./,:./,$(INC_HEADER))) DIR_INC += #add a NULL on trail DIR_INC := $(strip $(subst / , ,$(DIR_INC))) VPATH=$(DIR_INC) VPATH_INC=$(patsubst %,-I%,$(subst :, ,${VPATH})) SRC=$(sources_c) CLRDIR=$(notdir ${SRC}) OBJ=$(patsubst %.c,${DIR_OBJ}/%.o,$(CLRDIR)) CC =ccache arm-linux-gnueabihf-gcc LD =ccache arm-linux-gnueabihf-gcc LDFLAGS = -v -lgcc -lstdc++ -lm -lc -lgcc_s LDFLAGS += -L${DIR_LIB} -Wl,-rpath,`pwd`/${DIR_LIB} TARGET=myapp BIN_TARGET=${DIR_BIN}/${TARGET} .PHONY : clean rebuild all all: $(BIN_TARGET) %.d:%.c set -e; rm -f $@; \ $(CC) -MM $(VPATH_INC) $< > $@.$$$$; \ sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ rm -f $@.$$$$ include $(SOURCES:c=.d) $(BIN_TARGET):$(OBJ) $(LD) $(LDFLAGS) -o $@ $^ -lpthread -lm ${DIR_OBJ}/%.o:${DIR_SRC}/%.c $(CC) $(VPATH_INC) -c $< -o $@ clean: rm -rf $(DIR_OBJ)/*.o $(BIN_TARGET) rebuild: clean all