做网站的公司主要工作,wordpress和hugo,wordpress 添加水印,优秀网站设计推荐为什么写这个呢#xff0c;其实我有系统学过Makefile和CMake。但是因为用的不是很多或者说没有深入的使用场景#xff0c;导致我不是很熟练#xff0c;或者说没法优雅地使用。刚好最近对Linux的嵌入式编程比较感兴趣#xff0c;借着demo来分析一下资深工程师写的Makefile其实我有系统学过Makefile和CMake。但是因为用的不是很多或者说没有深入的使用场景导致我不是很熟练或者说没法优雅地使用。刚好最近对Linux的嵌入式编程比较感兴趣借着demo来分析一下资深工程师写的Makefile学习一下。由易到难吧先来第一个是一个GPIO的Makefile。
Makefile文件
BIN test_gpio
CC $(CROSS)gcc
CPP $(CROSS)g
LD $(CROSS)ld
#
INCS
LIBS
SUBDIRS
#
DEFINC -I ./ \# LIBVAR -shared -fPIE -L.
#
INCS $(DEFINC)
LIBS $(LIBVAR)
#
CSRCS $(wildcard *.c)
CPPSRCS $(wildcard *.cpp)
#
COBJS : $(CSRCS:.c.o)
CPPOBJS : $(CPPSRCS:.cpp.o)
#
CFLAGS $(INCS)
CFLAGS -O2 -Wall -g -fPIE
CPPFLAGS $(INCS)
CPPFLAGS -O2 -Wall -g -fPIE
LDFLAGS -lm -lrt -lstdc -ldlall:$(BIN)
$(COBJS) : %.o: %.c $(CC) $(CFLAGS) -c $ -o $
$(CPPOBJS) : %.o: %.cpp $(CPP) $(CPPFLAGS) -c $ -o $ $(BIN) : $(COBJS) $(CPPOBJS) $(CC) -o $(BIN) $(COBJS) $(CPPOBJS) $(LDFLAGS) $(LIBS) rm -rf $(COBJS) rm -rf $(CPPOBJS) .PHONY:clean cleanall clean: rm -rf $(BIN) $(COBJS) $(CPPOBJS)
#rm *.d
cleanall: rm $(BIN) $(COBJS) $(CPPOBJS) 拆解分析
BIN gpio_red_blink
CC $(CROSS)gcc
CPP $(CROSS)g
LD $(CROSS)ld
定义了变量BIN表示生成可执行文件名为gpio_red_blink定义变量CC表示使用的C编译器为$(CROSS)gcc其中$(CROSS是一个可能存在的前缀定义变量CPP表示使用的C编译器为$(CROSS)g定义变量LD表示使用的链接器为$(CROSS)ld
INCS
LIBS
SUBDIRS
定义空变量INCELIBSSUBDIRS
DEFINC -I ./ \
定义变量DEFINC指定编译过程中需要包含的头文件路径。这里设置为当前路径
INCS $(DEFINC)
LIBS $(LIBVAR)
将DEFINC添加到INCS中将未定义变量LIBVAR添加到LIBS中
CSRCS $(wildcard *.c)
CPPSRCS $(wildcard *.cpp)
使用通配符将当前目录所有.c文件加入到CSRCS变量中使用通配符将当前目录所有.cpp文件加入到CSRCS变量中
COBJS : $(CSRCS:.c.o)
CPPOBJS : $(CPPSRCS:.cpp.o)
将CSRCS中所有.c文件扩展名替换为.o并且赋值给COBJS将CPPSRCS中所有,cpp文件扩展名替换为.o并且赋值给CPPOBJS
CFLAGS $(INCS)
CFLAGS -O2 -Wall -g -fPIE
CPPFLAGS $(INCS)
CPPFLAGS -O2 -Wall -g -fPIE
LDFLAGS -lm -lrt -lstdc -ldl -lpthread
将INCS分别添加到CFLAGS和CPPFLAGS指定了编译包含头文件路径将-O2 -Wall -g -fPIE添加到CFLAGS和CPPFLAGS表示编译选项将-lm -lrt -lstdc -ldl -lpthread添加到LDFLAGS中表示链接选项
all:$(BIN)
定义了一个目标叫做all依赖于可执行文件$(BIN)
$(COBJS) : %.o: %.c$(CC) $(CFLAGS) -c $ -o $
定义了一个规则模式将.c文件编译为.o文件%表示通配符任意字符$表示第一个依赖的文件即.c文件$表示目标文件即.o文件
$(CPPOBJS) : %.o: %.cpp$(CPP) $(CPPFLAGS) -c $ -o $
定义了一个规则模式将.cpp文件编译为.o文件
$(BIN) : $(COBJS) $(CPPOBJS)$(CC) -o $(BIN) $(COBJS) $(CPPOBJS) $(LDFLAGS) $(LIBS)rm -rf $(COBJS)rm -rf $(CPPOBJS)
定义一个规则模式用于链接目标文件生成可执行文件$(BIN)$(BIN)依赖$(COBJS) $(CPPOBJS)链接完成后删除中间文件
.PHONY:clean cleanall
clean:rm -rf $(BIN) $(COBJS) $(CPPOBJS)
cleanall:rm $(BIN) $(COBJS) $(CPPOBJS)
定义两个伪目标(.PHONY)用于执行清理操作