【嵌入式】分享一个嵌入式中Makefile的通用Demo

1.前言

之前因为稍微学了点Makefile的基本语法,所以就想着自己写个Makefile,一来以后自己作参考,二来也是可以复习下之前的一些命令,三来就是分享啦~

2.基本功能

键入make:

*自动生成elf、lst、hex、bin、o文件;

*判断当前目录下是否有输出文件output、二进制文件obj的文件夹,若无,则新建,有则不执行;

*将输出文件和目标文件自动移动值对应文件夹;

键入make DEBUG

*调试命令,自定义以打印出中间文件名;

键入make LIBA

*生成静态库;

键入make LIBSO

*生成动态库;

键入make clean

*删除中间文件、目标文件、可执行文件、库文件等;

3.源码分享

COMPILE:=
GCC:=$(COMPILE)gcc
AR:=$(COMPILE)ar
OBJDUMP:=$(COMPILE)objdump
OBJCOPY:=$(COMPILE)objcopy
OUT_NAME:=main
TARGET:=$(OUT_NAME).elf
LST:=$(OUT_NAME).lst
BIN:=$(OUT_NAME).bin
HEX:=$(OUT_NAME).hex
DIR_LIB:=./src
SRC_LIB:=$(shell find $(DIR_LIB) -name "*.c")
OBJ_LIB:=$(patsubst %.c,%.o,$(SRC_LIB))
NAME_LIBA:=libmy_src.a
NAME_LIBSO:=libmy_src.so
#头文件的目录
INC:=-I./include
#找出当前目录及子目录中所有的.c文件
SRC:=$(shell find -name "*.c")
#将.c文件全部替换成同名的.o文件
OBJ:=$(patsubst %.c,%.o,$(SRC))
all:$(OBJ)
 $(GCC) -o $(TARGET) $^ #生成可执行文件
 $(OBJDUMP) -S -l $(TARGET) > $(LST) #生成lst文件
 $(OBJCOPY) -O ihex $(TARGET) $(HEX) #生成hex文件
 $(OBJCOPY) -O binary -S $(TARGET) $(BIN) #生成bin文件
 #hex->bin: $(OBJCOPY) -I ihex -O binary $(HEX) $(BIN) 
 if [ ! -d obj ];then \
  mkdir obj; \
 fi
 mv $(OBJ) obj
 if [ ! -d output ];then \
  mkdir output; \
 fi
 mv $(TARGET) $(LST) $(BIN) $(HEX) output
%.o:%.c
 $(GCC) -g -c -o $@ $^ $(INC)
.PHONY:DEBUG LIBA LIBSO clean
DEBUG:
 @echo $(SRC)
 @echo $(OBJ)
LIBA:$(OBJ_LIB)
 $(AR) rcs $(NAME_LIBA) $^
LIBSO:$(OBJ_LIB)
 $(GCC) -shared -fPIC -o $(NAME_LIBSO) $^
clean:
#-regex表示引用正则表达式
 find -regex ".*\.bin\|.*\.hex\|.*\.elf\|.*\.i\|.*\.o\|.*\.a\|.*\.so\|.*\.lst" | xargs rm -fr

4.效果演示

键入make之前的文件结构如下:【嵌入式】分享一个嵌入式中Makefile的通用Demo_第1张图片键入make之后再看文件结构:【嵌入式】分享一个嵌入式中Makefile的通用Demo_第2张图片

原文链接:

https://blog.csdn.net/weixin_46582567/article/details/127173753?spm=1001.2014.3001.5501

你可能感兴趣的:(公众号搬家,makefile,cmake,dll,cmd,uboot)