我想編譯和彙編,然後鏈接一些源文件。據我所知,它沒有告訴鏈接器使用VPATH中的路徑,直到我第二次運行它。 這裏的Makefile文件:第二次運行時只使用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/[email protected] $^
.c.o:
$(CC) $(CFLAGS) $(CINC) -DHWCLASS=$(HWDEF) -o obj/[email protected] -c $^
.s.o:
$(CC) $(CFLAGS) $(CINC) -DHWCLASS=$(HWDEF) -o obj/[email protected] -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/
謝謝!
.SUFFIXES已過時,它定義了處理文件的順序。在/ SUFFIXES語句中,它表示在.c文件之前處理.o文件。這將是一個問題。 make中的默認.SUFFIXES正確列出了所有文件名的結尾,所以.SUFFIXES不應該在'本地'makefile中 – user3629249