IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 万能makefile -> 正文阅读

[开发工具]万能makefile

Makefile常用函数

1. 获取当前目录下的所有同一类型的文件
$(wildcard *.h)$(wildcard *.c *.cpp)
#================================================================

2. 批量处理某一类型文件(替换、添加)
$(patsubst %.c, %.o, $(SRC))    	# 将$(SRC)中所有的.c文件换成.o文件
$(patsubst %, -I %, $(INCDIRS))  	# 将$(INCDIRS)中,所有文件加上 -I 前缀
#================================================================

3. 提取每一个目录下的 .c 文件
$(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))	
#================================================================

4. 将 CFILES 中的路径去掉  dev/adc.c => adc.c
$(notdir $(CFILES))								
#================================================================

5. 给 OBJS 加路径前缀,使其变成完整路径的形式
OBJS := $(addprefix $(OBJ_DIR)/,$(OBJS))
#================================================================

6. 根据 .c 推导出 .o
OBJS = $(SRCS:.c=.o)




1. 单个目录(最简单的Makefile)

在这里插入图片描述

CROSS_COMPILE ?=						# 没有定义交叉编译器时,直接用gcc
CC := $(CROSS_COMPILE)gcc			    # 编译器	
EXECUTABLE := bsp_test     				# 可执行文件名

INCLUDES   := $(wildcard *.h)           # 获取当前目录下的所有头文件
SRC := $(wildcard *.c)                  # 获取当前目录下的所有.c文件
OBJS := $(patsubst %.c, %.o, $(SRC))    # 将所有的.c文件换成.o文件 server.o ServerMain.o
CPPFLAGS := --std=c++11					# 编译时,如果文件包含c++11的特性,则需包含该标志

RM-F := rm -rf 
.PHONY : clean

$(EXECUTABLE) : $(OBJS)
	@echo	"输出变量OBJS的值,方便调试"
	@echo	$(OBJS)
	$(CC) -o $(EXECUTABLE) $(OBJS) $(CPPFLAGS)

%.o : %.c $(INCLUDES)
	$(CC) -c $< -o $@ $(CPPFLAGS)

clean:
	$(RM-F) $(EXECUTABLE) $(OBJS)



2. 多层目录(单个Makefile构建BSP)

在这里插入图片描述

CROSS_COMPILE ?= 							# 没有定义交叉编译器时,直接用gcc 
TARGET ?= bsp_test 							# 可执行文件名

CC := $(CROSS_COMPILE)gcc					# 编译器	

INCDIRS := device/adc \
		   		device/serialport \ 
				include \
				include/debug \

SRCDIRS := user \ 
				device/adc \
		   		device/serialport \ 

INCLUDE := $(patsubst %, -I %, $(INCDIRS))						# INCLUDE := -I device/adc -I device/serialport -I include -I include/debug
CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))	# 提取每一个目录下的 .c 文件
CFILENDIR := $(notdir $(CFILES))								# 使用函数 notdir 将 CFILES 中的路径去掉 main.c adc.c serialport.c
OBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))				# 将所有 .c 文件变成 .o 文件,放到 obj 文件夹下

VPATH := $(SRCDIRS)

.PHONY: clean

$(TARGET).bin : $(OBJS) 
	$(CC) $^ -o $@ 

clean:
	rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS)  


3. 多层目录(多个Makefile嵌套管理,类似于内核)

在这里插入图片描述


顶层Makefile: vim Makefile

CROSS_COMPILE ?= 							# 没有定义交叉编译器时,直接用gcc 
TARGET ?= bsp_test 							# 可执行文件名, 直接放在顶层目录
CC := $(CROSS_COMPILE)gcc					# 编译器	
MAKE  := make

TOP_DIR := $(shell pwd)
OBJ_DIR := $(TOP_DIR)/obj

INCDIRS := device/adc \
		   		device/serialport \ 
				include \
				include/debug \

SUB_DIR := device/adc \
			device/serialport \
			user
							
INCLUDE := $(patsubst %, -I %, $(INCDIRS))						# INCLUDE := -I device/adc -I device/serialport -I include -I include/debug
CFILES := $(foreach dir, $(SUB_DIR), $(wildcard $(dir)/*.c))	# 提取每一个目录下的 .c 文件
CFILENDIR := $(notdir $(CFILES))								# 使用函数 notdir 将 CFILES 中的路径去掉 main.c adc.c serialport.c
OBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))				# 将所有 .c 文件变成 .o 文件,放到 obj 文件夹下
	
CFLAGS  = -g -Wall   						# -Wall 表示输出警告信息

# 使在这个目录里面定义的变量可以在被调用的下级 Makefile 中使用。
export CC MAKE TOP_DIR OBJ_DIR SUB_DIR INCLUDE CFLAGS  
		
.PHONY: clean 

all: $(SUB_DIR) $(TARGET)
$(SUB_DIR) :
	$(MAKE) -C $@			# -C 一定需要大写, 执行每个目录下的Makefile
	
$(TARGET): $(OBJS)			# 链接目标文件,生成可执行文件
	$(CC) -g -o $@ $^
	@echo "make $(TARGET) done!"
	@echo ""

clean:
	rm -rf  $(OBJ_DIR )/*.o 
	rm -rf  $(TARGET)

device/adc/Makefile 、 device/serialport /Makefile 和 user/Makefile 同理

 
# 定义变量 SRCS, 用于指代所有的 .c文件。
SRCS = $(wildcard *.c)
# 根据 .c 推导出 .o
OBJS = $(SRCS:.c=.o)
# 给 OBJS 加路径前缀,使其变成完整路径的形式
OBJS := $(addprefix $(OBJ_DIR)/,$(OBJS))
 
.PHONY: taskslocal
# 此处必须加一个伪目标,因为 make 只能把没有匹配符的目标作为构造目标。
# 也就是说 Makefile 中至少要有一个没有匹配符的目标。否则会报没有 target 的错误。
taskslocal: $(OBJS)
 
# 用规则对 .o 文件个 .c 文件进行匹配。
$(OBJ_DIR)/%.o: %.c
	$(CC) -g -c $(CFLAGS) $(INCLUDE) -o $@ $<



  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 11:00:04  更:2021-08-02 11:01:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/20 13:26:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码