src = $(wildcard ./*.c) #obj = $(patsubst %.c, %.o, $(src)) obj = $(src:%.c=%.o)
时间: 2024-04-28 07:22:24 浏览: 286
这是一个Makefile中的变量定义,用于自动化编译C程序。其中,$(wildcard ./*.c)是通配符函数,用于查找当前目录下所有以.c为后缀名的文件,并将文件名列表存储在变量src中。$(patsubst %.c, %.o, $(src))是模式替换函数,用于将src变量中的.c文件替换成.o文件,并将替换后的文件名列表存储在变量obj中。另一种写法$(src:%.c=%.o)是变量替换函数,用于将变量src中的.c文件替换成.o文件,并将替换后的文件名列表存储在变量obj中。最终,变量obj中存储了当前目录下所有以.c为后缀名的文件所对应的.o文件名列表,这些.o文件可以作为编译目标文件的依赖项。
相关问题
SRC=$(wildcard *.cpp) OBJ=$(patsubst %.cpp, %.o,$(SRC))
这是一个 Makefile 中的语句,用于定义变量。其中:
- `SRC=$(wildcard *.cpp)` 表示将当前目录下所有的 `.cpp` 文件的文件名保存到 `SRC` 变量中,使用了 `wildcard` 函数。
- `OBJ=$(patsubst %.cpp, %.o,$(SRC))` 表示将 `SRC` 变量中的每个 `.cpp` 文件名替换成对应的 `.o` 文件名,并将结果保存到 `OBJ` 变量中,使用了 `patsubst` 函数。
举个例子,如果当前目录下有 `foo.cpp` 和 `bar.cpp` 两个文件,那么执行完上述语句后,`SRC` 变量的值为 `foo.cpp bar.cpp`,`OBJ` 变量的值为 `foo.o bar.o`。这样在后续的编译过程中,就可以方便地使用这两个变量来指定源文件和目标文件。
帮我讲解一下下面这些代码 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:清除目标文件、对象文件和反汇编文件。
阅读全文