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之前的文件结构如下:键入make之后再看文件结构:
原文链接:
https://blog.csdn.net/weixin_46582567/article/details/127173753?spm=1001.2014.3001.5501