makefile将中间文件生成到临时目录

 

TARGET := test

CC := g++ 

#注意每行后面不要有空格,否则会算到目录名里面,导致问题
SRC_DIR = src
BUILD_DIR = tmp
OBJ_DIR = $(BUILD_DIR)/obj
DEPS_DIR  = $(BUILD_DIR)/deps

#这里添加其他头文件路径
INC_DIR = \
	-I./include \
	-I./src \
	
#这里添加编译参数
CC_FLAGS := $(INC_DIR) -g -std=c++11
LNK_FLAGS := \
	-L/usr/local/lib 

#这里递归遍历3级子目录
DIRS := $(shell find $(SRC_DIR) -maxdepth 3 -type d)

#将每个子目录添加到搜索路径
VPATH = $(DIRS)

#查找src_dir下面包含子目录的所有cpp文件
SOURCES   = $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))  
OBJS   = $(addprefix $(OBJ_DIR)/,$(patsubst %.cpp,%.o,$(notdir $(SOURCES))))  
DEPS  = $(addprefix $(DEPS_DIR)/, $(patsubst %.cpp,%.d,$(notdir $(SOURCES))))  

$(TARGET):$(OBJS)
	$(CC) $^ $(LNK_FLAGS) -o $@

#编译之前要创建OBJ目录,确保目录存在
$(OBJ_DIR)/%.o:%.cpp
	if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi;\
	$(CC) -c $(CC_FLAGS) -o $@ $<

#编译之前要创建DEPS目录,确保目录存在
#前面加@表示隐藏命令的执行打印
$(DEPS_DIR)/%.d:%.cpp
	@if [ ! -d $(DEPS_DIR) ]; then mkdir -p $(DEPS_DIR); fi;\
	set -e; rm -f $@;\
	$(CC) -MM $(CC_FLAGS) $< > $@.$$$$;\
	sed 's,\($*\)\.o[ :]*,$(OBJ_DIR)/\1.o $@ : ,g' < $@.$$$$ > $@;\
	rm -f $@.$$$$

#前面加-表示忽略错误
-include $(DEPS)

.PHONY : clean
clean:
	rm -rf $(BUILD_DIR) $(TARGET)

 

最终目录结构是这个样子,tmp存放了所有中间文件, 源码在src目录。

直接在根目录执行make就可以了。

root@ubuntu:~/projects/MakeFileProject1# tree .
.
├── makefile
├── src
│   └── main.cpp
├── test
└── tmp
    ├── deps
    │   └── main.d
    └── obj
        └── main.o

Atmel AT32F415是一款基于ARM Cortex-M4的微控制器,其Makefile文件是一个用于配置和构建目标程序的自动化脚本,通常在使用集成开发环境(IDE)或命令行工具链(如Arm Keil MDK或uARM)时使用。Makefile根据预定义的规则和依赖关系,自动生成编译、链接、校验和清理等编译步骤。 以下是一个基本的Makefile结构示例: ```makefile # Makefile for AT32F415 project CC = arm-none-eabi-gcc # 编译器 AS = arm-none-eabi-as # 汇编器 AR = arm-none-eabi-ar # 链接器 OBJCOPY = arm-none-eabi-objcopy # 将可执行文件转换为二进制文件 OBJDUMP = arm-none-eabi-objdump # 查看可执行文件的机器代码 RM = rm -rf # 清理文件 # 项目源文件目录 SRC_DIR = src # 目标文件输出目录 OBJ_DIR = build # 预处理宏 CFLAGS = -mcpu=cortex-m4 -mlittle-endian -std=gnu99 -Wall -Os -ffunction-sections -fdata-sections # 链接器选项 LDFLAGS = -T linker_script.ld -Wl,--gc-sections # 待编译的目标 all: program program: $(OBJ_DIR)/main.o $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ # 分割成单独的.o文件 %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ # 清理对象文件中间文件 clean: $(RM) $(OBJ_DIR)/*.o $(OBJ_DIR)/program # 删除所有生成文件 distclean: clean $(RM) $(OBJ_DIR) # 当调用make时,默认执行all任务 .PHONY: all clean distclean ``` 在这个例子中: - `all` 是默认的任务,编译并生成最终的可执行文件。 - `clean` 清除编译过程中的临时文件。 - `distclean` 清除更彻底,包括clean和额外的生成文件。 - `%` 是通配符,用于匹配多个源文件名。 相关问题: 1. 如何在Makefile中指定编译器? 2. 什么是预处理宏CFLAGS?它们有什么作用? 3. 如何在Makefile中定义目标文件的命名规则?
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值