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之后再看文件结构:
写在最后,欢迎关注我们的公众号“脑补空间”,不错过每次推文~