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

1.前言

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

2.基本功能

键入make:
1.自动生成elf、lst、map、hex、bin、o文件;
2.判断当前目录下是否有输出文件output、二进制文件obj的文件夹,若无,则新建,有则不执行;
3.将输出文件和目标文件自动移动值对应文件夹;
键入make DEBUG
4.调试命令,自定义以打印出中间文件名;
键入make LIBA
5.生成静态库;
键入make LIBSO
6.生成动态库;
键入make clean
7.删除中间文件、目标文件、可执行文件、库文件等;

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
MAP:=$(OUT_NAME).map
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) $^ #生成可执行文件
	$(GCC) -o $(TARGET) $^ -Wl,-Map $(MAP) #生成map文件
	$(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) $(MAP) $(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\|.*\.map" | xargs rm -fr

4.效果演示

键入make之前的文件结构如下:
在这里插入图片描述

键入make之后再看文件结构:
在这里插入图片描述

写在最后,欢迎关注我们的公众号“脑补空间”,不错过每次推文~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT狼~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值