all:clean $(OBJS) clean 有啥用 能不能写成 all:clean $(OBJS) $(OBJSS)
时间: 2024-01-21 09:03:52 浏览: 142
`clean`是一个伪目标,用于清除之前生成的中间文件,以便重新生成。而`$(OBJS)`和`$(OBJSS)`是编译链接生成最终文件所必须的目标文件。因此,将`clean`放在`all`目标的依赖列表中,表示先执行`clean`目标,再编译链接生成最终文件。
如果将`all`目标写成`all:clean $(OBJS) $(OBJSS)`,表示`all`目标依赖于`clean`、`$(OBJS)`和`$(OBJSS)`,即会先执行`clean`目标,再编译链接生成最终文件。这样做是没有问题的,但是不够直观,不容易理解。因此,一般建议将`clean`目标单独列出来,便于清理中间文件。
相关问题
帮我讲解一下下面这些代码 CROSS_COMPILE ?= arm-linux-gnueabihf- TARGET ?= ledc CC := $(CROSS_COMPILE)gcc LD := $(CROSS_COMPILE)ld OBJCOPY := $(CROSS_COMPILE)objcopy OBJDUMP := $(CROSS_COMPILE)objdump INCDIRS := imx6u \ bsp/clk \ bsp/led \ bsp/delay SRCDIRS := project \ bsp/clk \ bsp/led \ bsp/delay INCLUDE := $(patsubst %, -I %, $(INCDIRS)) SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)) CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c)) SFILENDIR := $(notdir $(SFILES)) CFILENDIR := $(notdir $(CFILES)) SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)) COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o)) OBJS := $(SOBJS) $(COBJS) VPATH := $(SRCDIRS) .PHONY: clean $(TARGET).bin : $(OBJS) $(LD) -Timx6u.lds -o $(TARGET).elf $^ $(OBJCOPY) -O binary -S $(TARGET).elf $@ $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis $(SOBJS) : obj/%.o : %.S $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $< $(COBJS) : obj/%.o : %.c $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $< clean: rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
这段代码是一个Makefile文件,用于编译 ARM 架构的嵌入式系统程序。以下是代码中各个变量和规则的解释:
- CROSS_COMPILE:交叉编译工具链的前缀。
- TARGET:目标文件名。
- CC:编译器命令。
- LD:链接器命令。
- OBJCOPY:目标文件格式转换命令。
- OBJDUMP:反汇编命令。
- INCDIRS:头文件目录列表。
- SRCDIRS:源文件目录列表。
- INCLUDE:包含头文件的编译选项。
- SFILES:汇编文件列表。
- CFILES:C语言文件列表。
- SFILENDIR:汇编文件列表中不包含路径的文件名。
- CFILENDIR:C语言文件列表中不包含路径的文件名。
- SOBJS:编译后的汇编文件对象文件列表。
- COBJS:编译后的C语言文件对象文件列表。
- OBJS:所有对象文件列表。
- VPATH:源文件搜索路径。
Makefile中的规则:
- $(TARGET).bin:目标文件规则,依赖于所有的对象文件。
- $(LD):链接器命令,链接所有的对象文件生成ELF文件。
- $(OBJCOPY):目标文件格式转换命令,将ELF文件转换成二进制文件。
- $(OBJDUMP):反汇编命令,生成反汇编代码。
- $(SOBJS):汇编文件对象文件规则,依赖于汇编文件,使用$(CC)编译器进行编译。
- $(COBJS):C语言文件对象文件规则,依赖于C语言文件,使用$(CC)编译器进行编译。
- clean:清除目标文件、对象文件和反汇编文件。
解释# Makefile ROOTDIR = .. include $(ROOTDIR)/Rules.make CC=$(MVTOOL_PREFIX)gcc #CC=gcc EXEC = helloworld_arm OBJS = helloworld.o all: $(EXEC) $(EXEC): $(OBJS) $(CC) -o $@ $(OBJS) clean: rm -f $(EXEC) *.o
这是一个 Makefile 文件,用于编译一个名为 helloworld_arm 的可执行文件。以下是 Makefile 文件的各个部分的解释:
1. ROOTDIR = ..:定义一个名为 ROOTDIR 的变量,其值为 "..",即上层目录。
2. include $(ROOTDIR)/Rules.make:包含名为 Rules.make 的文件,该文件中定义了编译的规则和一些变量。
3. CC=$(MVTOOL_PREFIX)gcc:定义一个名为 CC 的变量,其值为 "$(MVTOOL_PREFIX)gcc",即交叉编译器的路径。
4. #CC=gcc:注释掉一个名为 CC 的变量,其值为 "gcc",即本地编译器的路径。
5. EXEC = helloworld_arm:定义一个名为 EXEC 的变量,其值为 "helloworld_arm",即要编译的可执行文件的名称。
6. OBJS = helloworld.o:定义一个名为 OBJS 的变量,其值为 "helloworld.o",即要编译的目标文件的名称。
7. all: $(EXEC):定义一个名为 all 的目标,该目标依赖于 EXEC 变量所指定的可执行文件。
8. $(EXEC): $(OBJS):定义一个名为 $(EXEC) 的目标,该目标依赖于 OBJS 变量所指定的目标文件。
9. $(CC) -o $@ $(OBJS):定义一个生成 $(EXEC) 文件的命令,该命令使用 CC 变量所指定的编译器,链接 OBJS 变量所指定的目标文件。
10. clean: rm -f $(EXEC) *.o:定义一个名为 clean 的目标,该目标用于清理编译过程中生成的文件,包括 $(EXEC) 文件和所有 .o 文件。
阅读全文