# makefile笔记 **Repository Path**: dmcus/makefile-notes ## Basic Information - **Project Name**: makefile笔记 - **Description**: makefie笔记和最小裸机系统学习,包含stm32 ch32 rp2040 esp32c3 的最小裸机系统,不使用库函数,startup文件的汇编改用C语言实现。 使用crotex-debug调试C代码,使用openocd 下载 和调试。 - **Primary Language**: C - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-09-06 - **Last Updated**: 2025-09-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## makefile笔记 make 官方文档 [https://www.gnu.org/software/make/manual/make.html#Reading](https://www.gnu.org/software/make/manual/make.html#Reading) ##### lesson 01 一般格式 ``` target(目标) … : prerequisites(先决条件) … recipe(命令) … … ``` -target 可以是 .o .bin .elf 等文件名,也可以是 all clean distclean 等 虚拟目标(PHONY)。 -prerequisites(先决条件)input 输入文件。 -recipe需要使用TAB键,makefile 对TAB,空格格式要求必须统一,否则编译失败。 ``` lesson01: # @target: hello # @input: files main.o a.o # @cmd: gcc -o target_name(目标文件,或者PHONY) input_files(依赖目标) # 执行顺序是 a.o -> main.o -> hello # rm 命令 windows下没有,需要从RTT中的env提取出来,件TOOLS文件夹 hello : main.o a.o gcc -o hello main.o a.o main.o : main.c main.h gcc -c main.c a.o : a.c a.h gcc -c a.c clean : rm hello.exe main.o a.o ``` ``` make ``` 命令行输出 ``` gcc -c main.c gcc -c a.c gcc -o hello main.o a.o ``` ##### lesson 02 03变量使用 省略 .C ,合并.o .h 都为变量,.o 依赖.h ``` C_SRC = main.c a.c C_OBJ = main.o a.o C_INC = a.h main.h TARGET = hello $(TARGET): $(C_OBJ) gcc -o hello $(C_OBJ) $(C_OBJ) : $(C_INC) gcc -c main.c gcc -c a.c clean : rm $(TARGET).exe $(C_OBJ) ``` ##### lesson 04 SRC INC BUILD 不同目录的 makefile ``` C_SRC_PATh = src C_SRC = src/main.c src/a.c C_INC_PATH = inc C_INC = inc/a.h inc/main.h BUILD_PATH = build C_OBJ = $(BUILD_PATH)/main.o $(BUILD_PATH)/a.o TARGET = hello # 依赖创建目录和编译 .c $(TARGET):$(BUILD_PATH) $(C_OBJ) gcc -o $(BUILD_PATH)/$(TARGET) $(C_OBJ) # 创建build目录 $(BUILD_PATH): mkdir $(BUILD_PATH) #编译.c $(C_OBJ):$(C_INC) gcc -c $(C_SRC_PATh)/main.c -I$(C_INC_PATH) -o $(BUILD_PATH)/main.o gcc -c $(C_SRC_PATh)/a.c -I$(C_INC_PATH) -o $(BUILD_PATH)/a.o .PHONY:clean clean : rm -rf $(BUILD_PATH) ```