😑MakefileSummary

原文🌈教程

项目文件结构

main.c

function.h

function.c


# 最终构建目标
TARGET_EXEC := final_program

# 构建目录
BUILD_DIR := ./build

# 源文件目录
SRC_DIRS := ./src


# 查找src目录下的所有.c .cpp .s后缀的文件
# ./src/function.c
# ./src/main.c
SRCS := $(shell find $(SRC_DIRS) -name '*.cpp' -or -name '*.c' -or -name '*.s')


# 字符串替换,OBJS为汇编后机器码文件的存放目录以及名称
# ./src/function.c -> ./build/./src/function.c.o
# ./src/main.c -> ./build/./src/main.c.o
OBJS := $(SRCS:%=$(BUILD_DIR)/%.o)


# ./src/function.c.d
# ./src/main.c.d
# 各个.c文件的依赖头,存放的文件
# 用于最后的-include
DEPS := $(OBJS:.o=.d)


# 查找SERC_DIRS下的所有目录,即源程序所在的目录
# ./src
INC_DIRS := $(shell find $(SRC_DIRS) -type d)


# 指定编译时候使用到的源文件在./src下面
# -I./src
INC_FLAGS := $(addprefix -I,$(INC_DIRS))

# The -MMD and -MP flags together generate Makefiles for us!
# These files will have .d instead of .o as the output.

# -MMD 和 -MM 相同,但是输出将导入到 .d 的文件里面。
# -MP 生成的依赖文件里面,依赖规则中的所有 .h 依赖项都会在该文件中生成一个伪目标,\
其不依赖任何其他依赖项。该伪规则将避免删除了对应的头文件而没有更新 “Makefile” \
去匹配新的依赖关系而导致 make 出错的情况出现。
CPPFLAGS := $(INC_FLAGS) -MMD -MP




# 开始构建项目
# ./build/final_program 依赖于build/src下面呢机器码文件,一开始不存在,下一步就是生成这些机器码文件
$(BUILD_DIR)/$(TARGET_EXEC): $(OBJS)
	$(CXX) $(OBJS) -o $@ $(LDFLAGS)


# 生成机器码文件
#./build/./src/main.c.o 依赖于MakefileTutorial/src下的c文件,由于这些文件存在直接运行下面的命令 
$(BUILD_DIR)/%.c.o: %.c

#创建build/src
	mkdir -p $(dir $@)
# 生成.d文件 汇编.o机器码文件
	$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@


# 没有C++文件用不到这一步
# Build step for C++ source
$(BUILD_DIR)/%.cpp.o: %.cpp
	mkdir -p $(dir $@)
	@echo $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@


# 清理
.PHONY: clean
clean:
	rm -r $(BUILD_DIR)

# Include the .d makefiles. The - at the front suppresses the errors of missing
# Makefiles. Initially, all the .d files will be missing, and we don't want those
# errors to show up.
-include $(DEPS)

make 一下😁

make后文件目录

查看一下.d文件

其中圈出来的就是-MP参数生成的,如果不加就不会出现这两行。

posted @ 2022-10-19 10:48  破忒头头  阅读(27)  评论(0)    收藏  举报