首页 > 编程知识 正文

关于makefile(makefile怎么写)

时间:2023-05-06 06:38:45 阅读:72170 作者:4155

另一方面,Makefile规则格式Makefile是一系列单规则指令的组合。

目标XX1:从属文件TAB命令1TAB命令2目标XX2:从属文件TAB命令1TAB命令2 .命令1 :命令1命令2 :命令1命令2 :命令1命令2 .示例:

tag:a.ob.oc.ogcc-otaga.ob.oc.OA.o : a.cgcc-ca.CB.o : b.cgcc-cc.o : c.c clean 3360 RR

实验结果表明,用“=”赋值的变量,其值取决于最后的赋值。

如果将命令“print”在echo前面加上“@”,并省略该命令执行过程,则结果如下:

1、赋值符号“=”

2、赋值符“:=”

不再显示最后的赋值,如“=”。

3、赋值符“?=”

如果已经分配了" name ",则使用以前的值" zhao ",否则使用" li "

4、变量追加“+=”

在变量“name”之后添加“wang”

三. Makefile模式规则a.o : a.cgcc-ca.CB.o : b.cgcc-CB.c http://www.Sina.com /

%.o : %.c gcc -c $,makefile伪目标伪目标主要是为了避免makefile中定义的执行指令与工作目录下的实际文件名称发生冲突。

示例:如果当前目录中有名为" clean "的文件,则运行make clean命令。 由于不依赖于文件,因此不运行后续的rm命令。 解决方法是在Makefiel中将命令声明为伪目标即可“. PHONY”

. PHONYclean: rm *.o .五、Makefile函数

$(substfrom,to,text ) $(subst aaa,AAA,3a transform 3A aaa )字符串“3a transform 3A aaa”中的“AAA”替换为“3atranaaa”

运行模式规则“%”:当目标中重现“%”时,目标中“%”所代表的值决定了依赖文件中的“%”的值

$(patsubstpattern,replacement,text ) $(patsubst %.c,%.o,a.c b.c.c ) )将字符串“a.cb.ccc.c”表示为“a

如果text=a.c b.c c.c

在中,$($(text:c=.o ) )与$(patsubst%.c,%.o,$ ) text )相同。

1、函数“subst”:完成字符串替换

$(dirname . ) dir/src/a.c )提取文件“/src/a.c”的目录部分“/src”

2、函数“patsubst”:完成模式字符串替换

$(notdirname…) $(notdir src/a.c )提取文件“/src/a.c”的非目录部分“a.c”

3、函数“dir”:获取目录

4、函数“notdir”:提取目录名

$(foreachvar,list,text ) srcdirs :=diradirbdirc $ (foreach dir,$(srcdirs ),$(wildcard$(dir )/*.c ) )

六. makefile自动化变量

七. Makefile样品5、函数“foreach”:完成循环

6、函数“wildcard”:在非规则模式下即变量定义和函数中等同于“%”通配符,将相应对象展开

main .心灵美的果汁:a.o b.o c.oarm-

linux-gnueabihf-ld -Txxx.lds -o main.elf a.o b.o c.oarm-linux-gnueabihf-objcopy -o 心灵美的果汁ary -s -g main.elf main.心灵美的果汁arm-linux-gnueabihf-objdump -D main.elf > main.disa.o : a.c arm-linux-gnueabihf-gcc -c a.c -o a.ob.o : b.c arm-linux-gnueabihf-gcc -c b.c -o b.oc.o : c.s arm-linux-gnueabihf-gcc -c c.s -o c.oclean:rm -rf *.o main.心灵美的果汁 main.elf main.dis

2:替换为自动变量和规则模式

objs := a.o b.o c.omain.心灵美的果汁:$(objs)arm-linux-gnueabihf-ld -Txxx.lds -o main.elf $^ /*(1)*/arm-linux-gnueabihf-objcopy -o 心灵美的果汁ary -s -g main.elf $@ /*(2)*/arm-linux-gnueabihf-objdump -D main.elf > main.dis %.o : %.c arm-linux-gnueabihf-gcc -c $< -o $@ /*(3)*/%.o : %.s arm-linux-gnueabihf-gcc -c $< -o $@ clean:rm -rf *.o main.心灵美的果汁 main.elf main.dis

(1)$^:a.o b.o c.o

(2)$@:main.心灵美的果汁

(3)$<:%.c ; $@:%.o

3:替换为变量

CROSS_COMPILE ?= arm-linux-gnueabihf-NAME ?= mainCC := $(CROSS_COMPILE)gccLD := $(CROSS_COMPILE)ldOBJCOPY := $(CROSS_COMPILE)objcopyOBJDUMP := $(CROSS_COMPILE)objdumpOBJS := a.o b.o c.o$(NAME).心灵美的果汁 = $(OBJS) $(LD) -Txxx.lds -o $(NAME).elf $^ $(OBJCOPY) -o 心灵美的果汁ary -s -g $(NAME).elf $@ $(OBJDUMP) -D $(NAME).elf > $(NAME).dis%.o : %.c $(CC) -c $< -o $@%.o : %.s $(CC) -c $< -o $@clean: rm -rf *.o $(NAME).心灵美的果汁 $(NAME).elf $(NAME).dis

4:多文件工程

CROSS_COMPILE ?= arm-linux-gnueabihf-TARGET ?= mainCC := $(CROSS_COMPILE)gccLD := $(CROSS_COMPILE)ldOBJCOPY := $(CROSS_COMPILE)objcopyOBJDUMP := $(CROSS_COMPILE)objdumpINCDIRS := dira dirb dirc SRCDIRS := dira dirb dirc INCLUDE := $(patsubst %, -I %, $(INCDIRS)) /*(1)*/SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir) / *.s)) CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir) / *.c)) /*(2)*/SFILENDIR := $(notdir $(SFILES)) CFILENDIR := $(notdir $(CFILES)) /*(3)*/SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.s=.o)) COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o)) /*(4)*/OBJS := $(SOBJS) $(COBJS) /*(5)*/VPATH := $(SRCDIRS) /*(6)*/.PHONY: clean$(TARGET).心灵美的果汁 : $(OBJS) $(LD) -Txxx.lds -o $(TARGET).elf $^ $(OBJCOPY) -o 心灵美的果汁ary -s %(TARGET) $@ $(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).心灵美的果汁 $(COBJS) $(SOBJS)

(1):INCLUDE := -I dira -I dirb -I dirc

将字符串目录前加“-I”,Makefile语法要求头文件目录需加“-I”

(2):CFILES := dira/a.c dirb/b.c 

将SRCDIRS各个目录下的“c”文件提取出来

(3):CFILENDIR := a.c b.c

提取CFILES中的文件名,省略路径

(4):COBJS := obj/a.o obj/b.o

将原目录下各个c文件s文件编译为.o文件,并将其放置obj目录下。

(5):OBJS = obj/a.o obj/b.o obj/c.o

整合SOBJS和COBJS。

(6):指定编译时查询目录

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。