一般当我们的工程文件较多的时候,使用gcc工具直接敲编译命令比较麻烦,所以写makefile的好处就来了,每次只需要敲一下make就能编译
这里分享一个万能版的,当前目录不管多少文件,都只需要make一下,不用修改makefile,直接生成main可执行程序
以下是makefile
#交叉编译工具链 #CC=arm-linux-gnueabihf-gcc CC=gcc #链接库 CFLAGS=-lm -lpthread #获取c文件 SrcFiles=$(wildcard *.c) #使用替换函数获取.o文件 OBJS= $ (patsubst %.c,%.o,$(SrcFiles)) all:main main:$(OBJS) $(CC) -o $@ $^ $(CFLAGS) %.o:%.c $(CC) -c $< $(CFLAGS) .PHONY:clean all clean: rm -rf $(OBJS) rm -rf main参考网友的工程目录带子目录的makefile
#交叉编译工具路径 CROSS_COMPILE= /opt/poky/1.7.3/sysroots/x86_64-pokysdk-linux/usr/bin/arm-linux-gnueabihf- CC = $(CROSS_COMPILE)arm-linux-androideabi-gcc AS = as LD = ld #CC = gcc CPP = $(CC) -E AR = ar NM = nm # 程序的默认名称 TARGET = main # 命令行中使用p=X或P=X修改默认程序名称 ifeq ("$(origin p)", "command line") TARGET = $(p) endif ifeq ("$(origin P)", "command line") TARGET = $(P) endif DIRS = $(shell find . -type d) # 找出所有的.c .h .a .so文件及目录 CFILES_DIR = $(shell find . -type f -name "*.c") CFILES = $(notdir $(CFILES_DIR)) HFILES_DIR = $(shell find . -type f -name "*.h") HFILES = $(notdir $(HFILES_DIR)) HDIRS = $(sort $(dir $(HFILES_DIR))) AFILES_DIR = $(shell find . -type f -name "lib*.a") AFILES = $(notdir $(AFILES_DIR)) ADIRS = $(sort $(dir $(AFILES_DIR))) SOFILES_DIR = $(shell find . -type f -name "lib*.so") SOFILES = $(notdir $(SOFILES_DIR)) SODIRS = $(sort $(dir $(SOFILES_DIR))) # 包含所有含有.h文件的目录 INCLUDES += $(HDIRS:%=-I%) $(warning INCLUDES : [ $(INCLUDES) ]) CFLAGS += $(INCLUDES) # 编译标志 CFLAGS += -Wall -Werror CFLAGS += -g -MD -O2 -static # 含有.a .so文件的目录 LDFLAGS += $(ADIRS:%=-L%) LDFLAGS += $(SODIRS:%=-L%) # 引用库文件 LDFLAGS += $(AFILES:lib%.a=-l%) LDFLAGS += $(SOFILES:lib%.so=-l%) LDFLAGS += -lpthread $(warning LDFLAGS : [ $(LDFLAGS) ]) # 包含所有的目录 VPATH = $(DIRS) # 所有的.c文件 SOURCES = $(CFILES) $(warning SOURCES : [ $(SOURCES) ]) # 目标及依赖 OBJS = $(SOURCES:%.c=obj/%.o) DEPS = $(SOURCES:%.c=obj/%.d) .PHONY : all clean cleanall all : $(TARGET) $(TARGET) : $(OBJS) @echo @echo "Linking..." @echo $(CC) $(LDFLAGS) $^ -o $@ @echo @echo "enjoy < $(TARGET) > Good Luck." @echo obj/%.o : %.c @mkdir -p obj $(CC) -c $< -o $@ $(CFLAGS) clean : rm -rf $(OBJS) $(DEPS) obj cleanall : rm -rf $(OBJS) $(DEPS) obj $(TARGET)这里补充说明
wildcard函数,就是获取指定的文件 patsubst函数,有替换功能。 $(Files),取File变量的值。 $@ 目标文件 $^ 全部依赖 $< 第一个依赖 $? 第一个变化的依赖
