gpt4 book ai didi

c - Make 仅在第二次运行时使用 VPATH?

转载 作者:太空宇宙 更新时间:2023-11-04 06:23:25 26 4
gpt4 key购买 nike

我正在尝试编译和汇编,然后链接一些源文件。据我所知,在我第二次运行它之前,它不会告诉链接器使用 VPATH 中的路径。这是生成文件:

#Makefile for SWS ARMKern

CC=arm-linux-gnueabi-gcc
LD=arm-linux-gnueabi-ld
CFLAGS=-g -Wall -Wextra -std=gnu11 -ffreestanding -march=armv6 -msoft-float -fPIC -mapcs-frame
LDFLAGS=-N -Ttext=0x10000
HWDEF=versatilepb #The set of hardware quirks to use.

#Paths
VPATH=src/:obj/
CINC=-Isrc/include/

kernel.elf: bootstrap.o kernel.o

.PHONY: clean test

clean:
rm -f obj/*.o elf/*.elf

test:
qemu-system-arm -M versatilepb -cpu arm1176 -nographic -soundhw none -kernel elf/kernel.elf

.SUFFIXES: .s .o .c .elf

.o.elf:
$(LD) $(LDFLAGS) -o elf/$@ $^

.c.o:
$(CC) $(CFLAGS) $(CINC) -DHWCLASS=$(HWDEF) -o obj/$@ -c $^

.s.o:
$(CC) $(CFLAGS) $(CINC) -DHWCLASS=$(HWDEF) -o obj/$@ -c $^

是这样的:

> ls
elf isosrc Makefile Makefile~ obj README.md README.md~ src
> make kernel.elf
arm-linux-gnueabi-gcc -g -Wall -Wextra -std=gnu11 -ffreestanding -march=armv6 -msoft-float -fPIC -mapcs-frame -Isrc/include/ -DHWCLASS=versatilepb -o obj/kernel.o -c src/kernel.c
arm-linux-gnueabi-gcc -g -Wall -Wextra -std=gnu11 -ffreestanding -march=armv6 -msoft-float -fPIC -mapcs-frame -Isrc/include/ -DHWCLASS=versatilepb -o obj/bootstrap.o -c src/bootstrap.s
arm-linux-gnueabi-ld -N -Ttext=0x10000 -o elf/kernel.elf kernel.o bootstrap.o
arm-linux-gnueabi-ld: cannot find kernel.o: No such file or directory
arm-linux-gnueabi-ld: cannot find bootstrap.o: No such file or directory
Makefile:26: recipe for target 'kernel.elf' failed
make: *** [kernel.elf] Error 1
> make kernel.elf
arm-linux-gnueabi-ld -N -Ttext=0x10000 -o elf/kernel.elf obj/kernel.o obj/bootstrap.o

我确定这只是我的 Makefile 的问题,但我很难过。如何确保链接器使用 VPATH 路径?或者甚至只是强制它查看 obj/

谢谢!

最佳答案

VPATH 是搜索 的路径,而不是目标,因此只有在 make 启动时存在于 VPATH 上的文件才是相关的。自从你第一次运行 make 以来,你的 .o 文件都不存在,make 找不到它们。你也撒谎用你的后缀规则 - 像 .c.o: 这样的规则告诉 make “这是如何在当前目录中制作一个 .o 文件.c 文件”,但随后的操作使文件位于 obj 子目录中。

如果您使用的是 GNU make 或 BSD make,则可以使用包含目录的模式规则:

elf/%.elf: obj/%.o:
$(LD) $(LDFLAGS) -o $@ $^

obj/%.o: %.c
$(CC) $(CFLAGS) $(CINC) -DHWCLASS=$(HWDEF) -o $@ -c $^

obj/%.o: %.s
$(CC) $(CFLAGS) $(CINC) -DHWCLASS=$(HWDEF) -o $@ -c $^

模式规则完全包含所有后缀规则的使用——GNU 或 BSD 让您永远不要使用后缀规则,而应该使用模式规则。

关于c - Make 仅在第二次运行时使用 VPATH?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30264917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com