C 使用子目录中的程序集对象文件

C 使用子目录中的程序集对象文件,c,gcc,makefile,C,Gcc,Makefile,我有一个小项目,有几个.c文件和一个.s汇编文件(crt0.s)。.c文件被编译成.o文件,并存储在./build子目录中。这些文件正确编译和链接 我希望.s文件也存储在./build目录中。到目前为止,我的makefile编译.s文件并将其存储在正确的位置,但是链接器找不到它 我得到的错误是“ld.exe找不到crt0.o”。crt0.o肯定是在./build目录中创建的 以下是生成文件: CC=arm-none-eabi-gcc AS=arm-none-eabi-as CFLAGS=-no

我有一个小项目,有几个.c文件和一个.s汇编文件(crt0.s)。.c文件被编译成.o文件,并存储在./build子目录中。这些文件正确编译和链接

我希望.s文件也存储在./build目录中。到目前为止,我的makefile编译.s文件并将其存储在正确的位置,但是链接器找不到它

我得到的错误是“ld.exe找不到crt0.o”。crt0.o肯定是在./build目录中创建的

以下是生成文件:

CC=arm-none-eabi-gcc
AS=arm-none-eabi-as

CFLAGS=-nostartfiles -nodefaultlibs -fno-builtin -Wall -T linker.ld -I./Include

objects=$(addprefix $(OBJDIR)/,crt0.o main.o gpiopins.o framebuffer.o drawchar.o putchar.o intconv.o strlen.o kprintf.o kputchar.o)

OBJDIR=./build

$(OBJDIR)/%.o: %.s
    $(AS) -o $@ $< 

$(OBJDIR)/%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

kernel.img: $(objects)
    $(CC) -o kernel.img $(objects) $(CFLAGS)

.PHONY : clean
clean:
    rm -f kernel.img
    rm -f *.o
    rm -f $(OBJDIR)/*.o
但是,这意味着crt0.o不在./build目录中

“手动”变量怎么可能正常?var对象包含链接器所需的./build/crt0.o。您推入的as命令没有提供它,那么它有什么帮助呢?即使它这样做了,也太晚了,因为所有对象一起都是规则的依赖项


执行make clean并向我们显示输出,这可能有助于发现正在发生的事情。

运行make-n查看实际发生的事情。当Makefile正在执行时,它应该回显正在运行的命令(默认情况下)。因此,您可以准确地看到所请求的命令,并将其与手动调用的命令进行比较。
kernel.img: $(objects)
    arm-none-eabi-as -o crt0.o crt0.s
    $(CC) -o kernel.img $(objects) $(CFLAGS)